역참조하는 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 를 해주어야한다.
'개발 > Django' 카테고리의 다른 글
[Django] Nested Serializer (3): 다대다필드(ManyToManyField)를 Serializer로 내려주기 (0) | 2022.09.12 |
---|---|
[Django] Nested Serializer (1): 정참조하고 있는 모델을 Serializer로 내려주기 (0) | 2022.09.12 |
서버 문제찾기부터 Django 최적화하는 방법까지 (0) | 2022.09.05 |