如何更改Django REST框架中的字段名称
我正在尝试更改DRF序列化程序中的模型字段名称,如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
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中添加别名,但无法更改。
更新
这是我面临的例外
/ ViewName /'module'对象的AttributeError没有属性'Field'
我怎样才能做到这一点?
谢谢
你可以使用serializers.SerializerMethodField
:
这里是模型 Park,它有名字和备用名字段。
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
这里是公园模型,ParkSerializer的串行器。 这将alternate_name的名称更改为位置。
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
然而,这将只适用于只读字段。
序列化器字段和序列化器中有一个非常好的function,通常称为“源”,您可以在其中指定来自模型字段的数据源。
class ParkSerializer(serializers.ModelSerializer): location = serializers.SomeSerializerField(source='alternate_name') class Meta: model = Park fields = ('other_fields', 'location')
其中serializer.SomeSerializerField可以是serializers.CharField作为你的模型build议,但也可以通过任何其他领域。 你也可以把关系字段和其他序列化器,而这将仍然像魅力。 即使alternate_name是另一个模型的外键字段。
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
我不确定erthalion的答案是如何处理创build,删除和修改资源对象的。 我的答案适用于每种types的请求。 它有效地创build了序列化程序中的字段名称和模型中的字段名称的一对一映射。
这也适用于写操作
class ParkSerializer(serializers.ModelSerializer): location = serializers.CharField(source='alternate_name') class Meta: model = Park fields = ('id', 'name', 'location')