Как показать данные вложенного сериализатора в родительской таблице (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").
Надеюсь, это поможет и решит вашу проблему.