시리얼라이저로 가져오고 싶은 데이터가 있었는데,
잘 되지 않아 몇 시간을 헤매다가 결국 도움을 받았다..
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)
를 입력해서 꼭 벨리데이션 체크를 해줘야지 원하는 값만 걸러서 들어온다.