Django Rest Framework 中的 to_representation() 可以访问普通字段

问题描述 投票:0回答:3

有关使用

to_representation
的文档有点短。
Django Rest Framework 3.0+
使用此方法来更改 API 中数据的表示形式。

这里是文档链接:

http://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior

这是我当前的代码:

from django.forms.models import model_to_dict

class PersonListSerializer(serializers.ModelSerializer):

    class Meta:
        model = Person
        fields = ('foo', 'bar',)

    def to_representation(self, instance):
        return model_to_dict(instance)

当我执行此代码时,它返回模型中的所有字段,而不是我在上面指定的字段

class Meta: fields

是否可以在

class Meta: fields
方法中引用
to_representation

python django django-rest-framework
3个回答
82
投票

DRF 的

ModelSerializer
已经拥有处理该问题的所有逻辑。在您的情况下,您甚至不需要自定义
to_representation
。如果你需要自定义它,我建议先调用 super,然后自定义输出:

class PersonListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('foo', 'bar',)

    def to_representation(self, instance):
        data = super(PersonListSerializer, self).to_representation(instance)
        data.update(...)
        return data

附注如果您有兴趣知道它是如何工作的,那么神奇的事情实际上并没有发生在

ModelSerializer.to_representation
中。事实上,它甚至没有实现该方法。它定期实施
Serializer
。 Django 模型的所有魔力实际上都发生在
get_fields
中,它调用
get_field_names
,然后考虑
Meta.fields
参数...


2
投票
def to_representation(self, instance):
    data = super(ResultLogSerializer, self).to_representation(instance)
    data['username'] = instance.job_result.user.username
    data['status'] = instance.job_result.status
    data['created'] = instance.job_result.created
    data['completed'] = instance.job_result.completed
    return data

0
投票

def to_representation(self, 实例): self.fields['国家'] = CountrySerializer(read_only=True) self.fields['state'] = StateSerializer(read_only=True)

def to_representation(self, instance):
       self.fields['country'] =  CountrySerializer(read_only=True)
       self.fields['state'] =  StateSerializer(read_only=True)
       self.fields['city'] =  CitySerializer(read_only=True)
       return super(AreaSerializer, self).to_representation(instance)

self.fields['city'] = CitySerializer(read_only=True) 返回 super(AreaSerializer, self).to_representation(instance)

© www.soinside.com 2019 - 2024. All rights reserved.