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}