Как правильно написать сериализатор для модели?
models.py:
from django.db import models
class Country(models.Model):
name = models.CharField('Название', max_length=150)
class City(models.Model):
name = models.CharField('Название', max_length=150)
country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name='Страна', related_name='cities')
class Person(models.Model):
name = models.CharField('Имя', max_length=150)
address = models.ManyToManyField(City, verbose_name='Адрес')
serializers.py:
from rest_framework import serializers
from .models import Country, City, Person
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
fields = '__all__'
class CityInnerListSerializer(serializers.ModelSerializer):
class Meta:
model = City
exclude = ('country',)
class CountrySerializer(serializers.ModelSerializer):
cities = CityInnerListSerializer(many=True)
class Meta:
model = Country
fields = '__all__'
class PersonSerializer(serializers.ModelSerializer):
address = CitySerializer(many=True)
class Meta:
model = Person
fields = '__all__'
views.py
from rest_framework import generics
from .models import City, Country, Person
from .serializers import CitySerializer, CountrySerializer, PersonSerializer
class CityListView(generics.ListAPIView):
queryset = City.objects.all()
serializer_class = CitySerializer
class CountryListView(generics.ListAPIView):
queryset = Country.objects.all()
serializer_class = CountrySerializer
class PersonListView(generics.ListAPIView):
queryset = Person.objects.all()
serializer_class = PersonSerializer
При запросе на person list в ответе приходит:
[
{
"id": 1,
"address": [
{
"id": 2,
"name": "Сочи",
"country": 1
},
{
"id": 3,
"name": "Волгоград",
"country": 1
},
{
"id": 4,
"name": "Бостон",
"country": 2
}
],
"name": "Бонифаций"
}
]
Как написать сериализатор, чтобы ответ формировался, примерно, в таком виде:
[
{
"id": 1,
"address": [
{
"country": {
"id": 1,
"cities": [
{
"id": 2,
"name": "Сочи",
},
{
"id": 3,
"name": "Волгоград"
}
],
"name": "Россия"
}
},
{
"country": {
"id": 2,
"cities": [
{
"id": 4,
"name": "Бостон"
}
],
"name": "США"
}
}
],
"name": "Бонифаций"
}
]
При этом нужно чтобы страны (поле country) не дублировались и в поле cities были те объекты, которые есть у объекта person. Или это можно сделать как-то по другому, не через сериализаторы? Буду благодарен любой помощи.