我正在尝试像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中添加别名,但无法更改。
更新
这是我面临的例外
/ ViewName /’模块’对象上的AttributeError没有属性’Field’
我怎样才能做到这一点?
你可以使用serializers.SerializerMethodField:
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模型的序列化器,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.CharFieldwith source属性:
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=...)其他字段类型。
serializers.DecimalField(source=...)
但是,这仅适用于只读字段。
序列化程序字段中有一个非常好的功能,而序列化程序通常称为“源”,你可以在其中指定来自模型字段的数据源。
class ParkSerializer(serializers.ModelSerializer): location = serializers.SomeSerializerField(source='alternate_name') class Meta: model = Park fields = ('other_fields', 'location')
如模型所建议的,其中serializers.SomeSerializerField可以是serializers.CharField,但也可以由其他任何字段组成。你也可以放置关系字段和其他序列化器,这仍然可以像魅力一样工作。即,即使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
这也适用于请求的创建,删除和修改类型。它有效地创建了序列化器中字段名称和模型中字段名称的一对一映射。