내 기준 복잡한 구조를 갖는 모델에 대한 create api를 구현했다.
이 게시물에서 설명할 api는 Dog를 create하는 api이다.
Dog 모델의 특징은 다음과 같다.
여기서 강아지 한 마리는 여러 개의 태그를 가질 수 있다.
우선 강아지를 등록하기 위해 전해주는 json 데이터의 예시는 아래와 같다.
{
"dog" : {
"name" : "제제",
"gender" : "M",
"age" : 12,
"introduction" : "활발한데 오래 걷지는 못해요"
},
"tags" : [
{
"number": 1
},
{
"number": 3
}
]
}
class DogSerializer(serializers.ModelSerializer):
class Meta:
model = Dog
fields = ('name', 'gender', 'age', 'introduction')
class DogTagSerializer(serializers.ModelSerializer):
class Meta:
model = DogTag
fields = ('number',)
class DogRegisterSerializer(serializers.Serializer):
dog = DogSerializer()
tags = DogTagSerializer(many=True)
def create(self, validated_data):
dog_data = validated_data['dog']
user = self.context['request'].user # JWT 인증을 통해 로그인된 사용자 정보 가져오기
dog = Dog.objects.create(user_id=user, **dog_data) # dog 객체 생성
if 'tags' in validated_data:
tags_data = validated_data['tags']
for tag_data in tags_data:
DogTag.objects.create(dog_id=dog, **tag_data)
return dog
many=True
속성을 추가한다.@api_view(['POST'])
@authentication_classes([JWTAuthentication])
def new_dog(request):
serializer = DogRegisterSerializer(data=request.data, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response({"message" : "강아지가 등록되었습니다."},status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=400)
context={'request': request}
는 현재 HTTP 요청 객체를 직렬화 클래스에 전달하는 부분이다.self.context['request'].user
를 통해 현재 인증된 사용자를 참조할 수 있다.(user_id가 필요하기 때문에 보내준다.)
잘 등록되는 것을 확인할 수 있다!