Today_I_Learned

[Django DRF] Serializer에서 id를 사용한 M:N 관계

CONCAT 2023. 11. 13. 12:05
728x90

Django REST Framework(DRF)에서 Many-to-Many(M:N) 관계

  • Book과 Author 모델이 M:N 관계에 있다고 가정
  • Book 모델이 여러 Author를 가질 수 있고, 반대로 Author도 여러 Book을 가질 수 있는 상황
  • 이미 작성된 author를 사용한다고 가정
# models.py

from django.db import models

class Author(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author, related_name='books')
# serializers.py

...

class BookSerializer(serializers.ModelSerializer):
    authors = serializers.PrimaryKeyRelatedField(many=True, queryset=Author.objects.all())

    class Meta:
        model = Book
        fields = ['id', 'title', 'authors']

	# 유효성 검사를 마친 데이터에 대해서 추가적인 커스텀 로직 가능
    def create(self, validated_data):
        authors_ids = validated_data.pop('authors')
        book = Book.objects.create(**validated_data)
        book.authors.set(authors_ids)
        return book
# JSON 예시
{
    "title": "새 책",
    "authors": [1, 2]
}
  • PrimaryKeyRelatedField를 사용하면 클라이언트로부터 전달받은 ID에 해당하는 Author 인스턴스들을 조회하여 Book의 authors에 할당
  • queryset=Author.objects.all()는 해당 필드가 어떤 모델의 인스턴스들을 참조할 것인지를 지정

 

참고자료