如何在 Django REST 框架中更改字段名称 [英] How to change field name in Django REST Framework

查看:375
本文介绍了如何在 Django REST 框架中更改字段名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试更改 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.CharFieldsource 属性一起使用:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆