본문 바로가기

개발/Django

[Django] Nested Serializer (2) : 역참조하고 있는 모델을 Serializer로 내려주기

역참조하는 Model 을 내려주는 방법

 

class BookAuthor(models.Model):
	class Meta:
		verbose_name = '작가'
		verbose_name_plural = verbose_name

	name = models.CharField(
		verbose_name='이름',
	)
	real_name = models.CharField(
		verbose_name='실명',
		null=True,
		blank=True,
	)
	introduction = models.TextField(
		verbose_name='소개',
		null=True,
		blank=True,
	)


class Book(models.Model):
	class Meta:
		verbose_name = '책'
		verbose_name_plural = verbose_name

	title = models.CharField(
		verbose_name='제목',
		max_length=32,
	)
	price = models.PositiveIntegerField(
		verbose_name='가격',
		default=0,
	)
	inventory_amount = models.PositiveIntegerField(
		verbose_name='재고 수량',
		default=0,
	)
	author = models.ForeignKey(
		to='BookAuthor',
		on_delete=models.SET_NULL,
		related_name='books',
	)
	published_at = models.DateField(
		verbose_name='발매일',
	)

위와 같이 Book이 BookAuthor 를 참조한다. 하지만 지금 하려고 하는 것은 Book을 내려주는 것이 아니라 BookAuthor를 Serializer로 내려주려한다.

 

분명, BookAuthor에는 book라는 필드는 없지만, 이미 Book 모델에서는 author라는 이름의 foreignkey(외래키) related_name으로 'books' 라고 정의해주었기 때문에 이 이름으로 내려줄 수 있다. 즉, nested serializer에서도 역참조된 모델을 가져올 수 있다.

 

Nested Serializer 로 역참조된 Model 가져오기

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = (
            'id',
            'title',
            'price',
            'inventory_amount',
            'published_at',
        )
        

class BookAuthorSerializer(serializers.ModelSerializer):
	books = BookSerializer(many=True, required=False)  # Book 모델의 books란 Foreignkey의 related_name
    
    class Meta:
        model = BookAuthor
        fields = (
            'id',
            'name',
            'real_name',
            'introduction',
            'books',
        )

 

주의할 점은, 중첩해서 내려주려고하는 books는 역참조된 것으로, BookAuthor 입장에서 Book은 여러개가 될 수 있다.

따라서 serializer 옵션으로 many=True 를 해주어야한다.