如何在Django REST Framework中更改字段名称

Sho*_*jaz 78 django django-rest-framework

我试图在DRF Serializer中更改模型字段名称,如SQL中的别名.我尝试过不同的方法,但不能成功.

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
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

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

更新

这是我面临的例外

/ ViewName /'module'对象的AttributeError没有属性'Field'

我怎样才能做到这一点?

谢谢

ian*_*kit 191

串行器字段和序列化器中有一个非常好的功能,通常称为"源",您可以在其中指定模型字段中的数据源.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SomeSerializerField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')
Run Code Online (Sandbox Code Playgroud)

其中serializers.SomeSerializerField可以是serializers.CharField,如模型所示,但也可以是任何其他字段.你也可以把关系字段和其他序列化器放在一起,这仍然可以像魅力一样工作.即使alternate_name是另一个模型的foreignkey字段.

class ParkSerializer(serializers.ModelSerializer):
    locations = AlternateNameSerializer(source='alternate_name', many=true)

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

class AlternateNameSerializer(serializers.ModelSerialzer):
    class Meta:
        model = SomeModel
Run Code Online (Sandbox Code Playgroud)

这也适用于创建,删除和修改请求类型.它有效地创建了序列化器中字段名称和模型中字段名称的一对一映射.

  • 就我而言(外键),我用“locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())”解决了这个问题。显然也可以使用“RelatedField”。 (3认同)

ert*_*ion 38

你可以使用serializers.SerializerMethodField:

这是模型 Park,它有name和alternate_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
Run Code Online (Sandbox Code Playgroud)

这是 Park Model的Serializer,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
Run Code Online (Sandbox Code Playgroud)

然而,这仅适用于只读字段.

  • 这不应该是公认的答案.参见下面的一篇,在我写这篇文章的时候,它的评价几乎是5倍. (11认同)
  • 这是一个糟糕的解决方案.使用`source` kwarg,如下所述. (4认同)
  • 这个锻炼如何创建和编辑请求? (3认同)
  • 《Python 之禅》第 13 行:“应该有一种——最好只有一种——明显的方法来做到这一点。” (2认同)

vij*_*jay 12

这也适用于写操作

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')
Run Code Online (Sandbox Code Playgroud)