是否可以将单个m2m Django模型字段拆分为多个DRF序列化器字段?
考虑以下代码:
models.py:
class Author(models.Model):
name = models.CharField()
class BookQuerySet(models.QuerySet):
def good(self):
return self.filter(is_good=True)
def bad(self):
return self.filter(is_good=False)
class Book(models.Model):
objects = BookQuerySet.as_manager()
title = models.CharField()
author = models.ForeignKey(Author, related_name="books")
is_good = models.BooleanField(default=False)
serializers.py:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ["title"]
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ["name", "books"]
books = BookSerializer(many=True)
我是否可以通过任何方式实际上将“书”序列化为good_books
和bad_books
,但仍然将它们映射到单个的books
字段Author
模型?
请记住,这些必须是可写的嵌套序列化器。
答案 0 :(得分:2)
当然可以,定义一个serializeMethodField
class AuthorSerializer(serializers.ModelSerializer):
books = BookSerializer(many=True) # here you get all books
good_books = serializers.serializeMethodField()
bad_books = serializers.serializeMethodField()
class Meta:
model = Author
fields = ["name", "books", "good_books", "bad_books"]
def get_good_books(self, author):
return BookSerializer(author.books.good()).data
def get_bad_books(self, author):
return BookSerializer(author.books.bad()).data
或:
class AuthorSerializer(serializers.ModelSerializer):
books = serializers.serializeMethodField()
class Meta:
model = Author
fields = ["name", "books"]
def get_books(self, author):
# bad and good books in the same key
# result like:
# "books": { "bad_books": [....list], "good_books": [...list}}
return {
"good_books": BookSerializer(author.books.good()).data,
"bad_books": BookSerializer(author.books.bad()).data,
}