如何在 Django REST 框架中更改字段名称 [英] How to change field name in Django REST Framework
问题描述
我正在尝试更改 DRF 序列化程序中的模型字段名称,如 SQL 中的别名.我尝试了不同的方法,但都没有成功.
I am trying to change Model field name in DRF Serializer like alias in SQL. I have tried different methods but cannot succeed.
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 中添加别名,但无法更改.
I have also tried to add alias in Django Queryset but cannot changed.
更新
这是我面临的例外
/ViewName/'module' 对象的 AttributeError 没有属性 'Field'
AttributeError at /ViewName/ 'module' object has no attribute 'Field'
我该怎么做?
推荐答案
可以使用serializers.SerializerMethodField
:
这是模型 Park,其中包含 name 和 alternate_name 字段.
Here is the model Park, which has name and alternate_name fields.
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 模型的 Serializer,ParkSerializer.这会将alternate_name 的名称更改为位置.
Here is Serializer for Park Model, ParkSerializer. This changes the name of alternate_name to 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.CharField
与 source
属性一起使用:
Additionally, you can use serializers.CharField
with source
attribute:
class ParkSerializer(serializers.ModelSerializer):
location = serializers.CharField(source='other_fields')
class Meta:
model = Park
fields = ('other_fields', 'location')
Django 用于遍历外键的 __
表示法也可以:
Django's __
notation to traverse foreign key also works:
location = serializers.CharField(source='OtherModel__other_fields')
如果您想更改 API 上的返回类型,同样的原则也适用,因此您也可以执行 serializers.DecimalField(source=...)
和其他字段类型.
The same principle applies if you want to change the return type on the API, so you can do serializers.DecimalField(source=...)
and other field types as well.
但这仅适用于只读字段.
This would however work only for read only fields.
这篇关于如何在 Django REST 框架中更改字段名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!