我试图像SQL中的别名一样更改DRF序列化器中的“模型”字段名称。我尝试了不同的方法,但无法成功。

models.py

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

serializers.py
class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


    class Meta:
        model = Park
        fields = ('id', 'name', 'location')

我也曾尝试在Django Queryset中添加别名,但无法更改。

更新了

这是我面临的异常(exception)



我怎样才能做到这一点?

最佳答案

您可以使用serializers.SerializerMethodField:

这是 Park模型,它具有name和Alternative_name字段。

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

这是Park Model,ParkSerializer的序列化器。这会将alternate_name的名称更改为location。
class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SerializerMethodField('get_alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

    def get_alternate_name(self, obj):
        return obj.alternate_name

此外,您可以将serializers.CharFieldsource属性一起使用:
class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='other_fields')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

Django的遍历外键的__表示法也适用:
location = serializers.CharField(source='OtherModel__other_fields')
如果要更改API的返回类型,则适用相同的原理,因此也可以执行serializers.DecimalField(source=...)和其他字段类型。

但是,这仅适用于只读字段。

10-01 01:16