Как правильно написать сериализатор для модели?

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. Или это можно сделать как-то по другому, не через сериализаторы? Буду благодарен любой помощи.


Ответы (0 шт):