Могу ли я разделить одно поле модели Django на несколько полей сериализатора Django Rest Framework? - PullRequest
0 голосов
/ 03 августа 2020

Можно ли разделить одно поле модели 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?

Имейте в виду, что они должны быть записываемыми вложенными сериализаторами.

1 Ответ

2 голосов
/ 03 августа 2020

, конечно, вы можете определить 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,
      }
...