получить значения внешнего ключа drf django - PullRequest
0 голосов
/ 23 марта 2020

каждая работающая вещь просто хочет изменить представления:

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)

вывод:

[{
"id": 1,
"city_type": {
    "value": "Normal City"
},
"city_tier": {
    "value": "Tier I"
},

"name": "test",
"status": 1,


}]

Я ожидаю вывод наподобие этого:

[{
"id": 1,
"city_type": "Normal City",
"city_tier": "Tier I",
"name": "test",
"status": 1,


}]

или просто добавьте другое поле city_type__values ​​в вывод. я попробовал это с:

City.objects.all().values('city_type','city_type__value')

, как этот орех его ошибка получения .............................. .................................................. .............

1 Ответ

1 голос
/ 23 марта 2020

Я думаю, что самый простой способ - использовать атрибут source :

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)
    ...

Если вы хотите сохранить структуру ключ-значение для вложенных полей, вы можете использовать метод 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}
...