DRF нормализует вложенный сериализатор

В моих моделях есть поле ManyToMany. В сериализаторе я могу получить вложенные сериализованные данные, но я хочу нормализовать их.

models.py

class Authors(models.Model):
   name = models.CharField(max_length=20)
    
   class Mets:
      db_table = "authors"

class Books(models.Model):
   book_name = models.CharField(max_length=100)
   authors = models.ManyToManyField(Authors, related_names="books")

   class Meta:
      db_table = "books"

serializers.py

class AuthorSerializer(serializer.ModelSerializer):
   name = serializer.CharField()
   
   class Meta:
      model = Authors
      field = ("name",)

class BooksSerializer(serializer.ModelSerializer):
   authors = AuthorSerializer()
   
   class Meta:
      model = Books
      field = ("book_name", "authors")

Вывод из вышеприведенного будет следующим:

"result": [
 {
   "book_name": "Sample",
   "authors": [
    {
      "name": "Person 1",
    },
    {
      "name": "Person 2",
    }
   ]
  }
]

Но я хочу вывести что-то вроде этого:

"result": [
 {
   "book_name": "Sample",
   "author_name": "Person 1",
 },
 {
   "book_name": "Sample",
   "author_name": "Person 2",
 },
]

Если вы хотите изменить поведение отображения, вы должны переопределить to_representation()

def to_representation(self, instance):
   data = super().to_representation(instance)
   authors = data.pop('authors')
   retval = list()
   for author in authors:
     retval.append({**data, "author_name": author.get("name")})

   return {"result": retval}
Вернуться на верх