我可以将单个Django模型字段拆分为多个Django Rest Framework序列化器字段吗?

时间:2020-08-03 15:02:49

标签: django django-rest-framework

是否可以将单个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_booksbad_books,但仍然将它们映射到单个的books字段Author模型?

请记住,这些必须是可写的嵌套序列化器。

1 个答案:

答案 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,
      }