首页 文章

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

提问于
浏览
62

我试图在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

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中添加别名但无法更改 .

Updated

这是我面临的例外

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

我怎样才能做到这一点?

谢谢

3 回答

  • 26

    你可以使用 serializers.SerializerMethodField

    Here is the model 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
    

    Here is Serializer 适用于Park Model,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
    

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

  • 161

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

    class ParkSerializer(serializers.ModelSerializer):
        location = serializers.SomeSerializerField(source='alternate_name')
    
        class Meta:
            model = Park
            fields = ('other_fields', 'location')
    

    其中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
    

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

  • 11

    这也适用于写操作

    class ParkSerializer(serializers.ModelSerializer):
        location = serializers.CharField(source='alternate_name')
    
        class Meta:
            model = Park
            fields = ('id', 'name', 'location')
    

相关问题