Django 시리얼라이저

may_soouu·2021년 1월 20일
3
post-thumbnail

시리얼라이저로 가져오고 싶은 데이터가 있었는데,
잘 되지 않아 몇 시간을 헤매다가 결국 도움을 받았다..

내가 하고 싶었던 것

  1. 계속 외부 사이트에 콜 날려서 데이터를 가져옴
  2. 로컬 DB에는 아무것도 없고, 저장도 안 할 거임
  3. 가져온 데이터에 필드가 여러개인데, 그 중 내가 원하는 필드만 뽑아서 프론트로 반환

기존에 알던 방식

data = [{
    'fare'     : i['fare'],
    'baseFare' : i['baseFare'],
    'latitude' : i['latitude'],
    'fareTime' : i['fareTime'],
    'longitude' : i['longitude'],
    }for i in all_list]

return JsonResponse({'data': data }, status=200)

가져오고자 하는 필드를 변수로 지정해서, 리프트 컴프리헨션으로 for문을 돌리고, 변수에 지정해주는 방법이다.
하지만, 변수 하나하나 지정하는 방법 말고 시리얼라이저를 적용해서 원하는 필드만 빼오고 싶었다.

시리얼라이저 적용

1. models.py 에 가져오고자 하는 필드 지정

class Location(models.Model):
    fare = models.IntegerField()
    baseFare = models.IntegerField()
    latitude = models.FloatField()
    fareTime = models.IntegerField()
    longitude = models.FloatField()
    
2. seriailizers.py 에 모델쓰에 있는 필드 전부 가져오겠다 명시

from rest_framework import serializers
from scooter.models import Location


class LocationSerialzer(serializers.ModelSerializer):
    class Meta:
        model = Location
        fields = '__all__'
        
3. views.py 에 외부에서 가져온 데이터 중에 
   내가 시리얼라이저로 지정한 필드만 가져오겠다 작성하기

serializer = LocationSerialzer(data = location['data'], many=True)
serializer.is_valid(raise_exception=True)
data = json.dumps(serializer.data)

여기서 포인트!!
serializer.is_valid(raise_exception=True)
를 꼭 써줘야 한다.

나는 처음에 내가 가져오려는 필드만 DB에 넣고, 시리얼라이저에
fields = 'all'

라고 선언했기 때문에 가져오는 외부 데이터에서 내가 원하는 필드만 알아서 가져온다고 생각했다.
하지만,
serializer.is_valid(raise_exception=True)
를 입력해서 꼭 벨리데이션 체크를 해줘야지 원하는 값만 걸러서 들어온다.

profile
back-end 개발자

0개의 댓글