Reputation: 558
every thing working just want to modify the views:
models.py:
class TypeOfCity(models.Model):
key = models.CharField(verbose_name=_("key"), max_length=15, unique=True)
value = models.CharField(verbose_name=_("value"), unique=True, max_length=15)
status = models.SmallIntegerField(_("status:1 for Active; 0: Inactive"), default=1)
def __str__(self):
return self.key
class CityTier(models.Model):
key = models.CharField(verbose_name=_("key"), max_length=10, unique=True)
value = models.CharField(verbose_name=_("value"), unique=True, max_length=10)
status = models.SmallIntegerField(_("status:1 for Active; 0: Inactive"), default=1)
def __str__(self):
return self.key
class City(BaseModel):
name = models.CharField(_("City Name"), max_length=80, null=False, blank=False)
state_name = models.ForeignKey(State, to_field="uid", on_delete=models.DO_NOTHING, max_length=55, null=False, blank=False)
city_type = models.ForeignKey(TypeOfCity, to_field="key", on_delete=models.DO_NOTHING, max_length=15, null=False, blank=False)
city_tier = models.ForeignKey(CityTier, to_field="key", on_delete=models.DO_NOTHING, max_length=10, null=False, blank=False)
status = models.SmallIntegerField(_("Status: 1 for Active; 0:Inactive"), default=1)
serializers.py:
class TypeOfChoiceSerializer(serializers.ModelSerializer):
class Meta:
model = TypeOfChoice
fields = ('value',)
class CityTierSerializer(serializers.ModelSerializer):
class Meta:
model = CityTier
fields = ('value',)
class CitySerializer(serializers.ModelSerializer):
city_type = TypeOfChoiceSerializer(read_only=True)
city_tier = CityTierSerializer(read_only=True)
def get_typeofchoices(self,obj):
return TypeOfChoiceSerializer(TypeOfChoice.objects.all()).data
def get_city_tiers(self,obj):
return CityTierSerializer(CityTier.objects.all()).data
class Meta:
model = City
fields = '__all__'
views.py:
@api_view(['POST'])
def cityList(request):
queryset = City.objects.all()
serializer_obj = CitySerializer(queryset, many=True)
return HttpResponse(serializer_obj.data)
output:
[{
"id": 1,
"city_type": {
"value": "Normal City"
},
"city_tier": {
"value": "Tier I"
},
"name": "test",
"status": 1,
}]
i'm expecting output like this:
[{
"id": 1,
"city_type": "Normal City",
"city_tier": "Tier I",
"name": "test",
"status": 1,
}]
or just add another city_type__values field in output. i tried that with :
City.objects.all().values('city_type','city_type__value')
like that nut its getting error.............................................................................................
Upvotes: 0
Views: 41
Reputation: 4432
I think the simplest way is to use source attribute:
class CitySerializer(serializers.ModelSerializer):
city_type = serializers.CharField(source='city_type__value', read_only=True)
city_tier = serializers.CharField(source='city_tier__value', read_only=True)
...
If you want to preserve key-value structure for nested fields, you can use method field:
class CitySerializer(serializers.ModelSerializer):
city_type = serializers.SerializerMethodField()
city_tier = serializers.SerializerMethodField()
class Meta:
model = Parent
fields = (<other_fields>, 'city_type', 'city_tier')
def get_city_type(self, obj):
return {obj.city_type.key: obj.city_type.value}
def get_city_tier(self, obj):
return {obj.city_tier.key: obj.city_tier.value}
Upvotes: 1