Как показать данные вложенного сериализатора в родительской таблице (Serializer) единым списком в python django rest framework

Таблица стран является таблицей дедушек и бабушек

class Country(models.Model):
   country_id = models.IntegerField(primary_key=True)
   cname = models.CharField(max_length=100)
   
   def __str__(self):
     return self.name

Таблица государств, которая является прямым ребенком страны

class State(models.Model):
   stateid = models.IntegerField(primary_key=True)
   state_name= models.CharField(max_length=100)
   s_country = models.ForeignKey(Country, related_name='scountry', on_delete =models.CASCADE)
   
   def __str__(self):
     return self.state_name
<<<Таблица

City, которая является прямым потомком State и косвенным потомком Country

class City(models.Model):
   cityid= models.IntegerField(primary_key=True)
   city_name = models.CharField(max_length=100)
   city_strength = models.IntegerField()
   city_state = models.ForeignKey(State, related_name='cstate', on_delete =models.CASCADE)
   
   def __str__(self):
     return self.sname

Сериализаторы

class StateSerializer(serialiizer.ModelSerializer):
   
   class Meta:
      model = State
      fields = '__all__'


class CitySerializer(serialiizer.ModelSerializer):
   
   class Meta:
      model = City
      fields = '__all__'


class FliterStateCitySerializer(serializers.ModelSerializer):
   state = StateSerializer(many=true)
   cities = CitySerializer(many=true)
   
   class Meta:
      model = Country
      fields = ('id', 'state', 'city')

Виды

class FilterStateCityView(generics.ListAPIView):
   queryset = Country.objects.all()
   serializer_class = FliterStateCitySerializer

Ответ, который я получаю, следующий.

[
 {
  "country_id":"23",
  "cname": "USA",
  "state" : {
              "stateid": "16",
              "state_name": "Florida",
              "cities" : {
                           "cityid":"55",
                           "city_name": "Miami",
                           "city_strength ": 40005
                         },
                         {
                           "cityid":"56",
                           "city_name": "Orlando",
                           "city_strength ": 930067
                         },

            },
            {
              "stateid": "17",
              "state_name": "Texas",
              "s_country" : "USA"
            },
            
 }
]

Ответ, который я хочу...

[
 {
  "country_id":"23",
  "stateid": "16",
  "cityid":"55",
  "state_name": "Florida",
  "city_name": "Miami",
  "city_strength ": 40005
 },
 {
  "country_id":"23",
  "stateid": "16",
  "cityid":"56",
  "state_name": "Florida",
  "city_name": "Orlando",
  "city_strength ": 930067
 },
 {
   "stateid": "17",
   "state_name": "Texas",
   "s_country" : "USA"
  },
]

Мой вопрос заключается в том, что я хочу получить все штаты на основе id страны вместе с соответствующими городами в одном списке как объект один на один.

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

city_name = serializers.StringRealtedField(source='self.scountry.cstate.city_name')

state_id = serializers.PrimaryKeyRealtedField(source="self.scountry.stateid").

Надеюсь, это поможет и решит вашу проблему.

Вернуться на верх