python Django Rest框架中的to_representation()可以访问普通字段吗

cyej8jka  于 2023-01-11  发布在  Python
关注(0)|答案(2)|浏览(144)

关于使用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中指定的字段。
是否可以在to_representation方法中引用class Meta: fields

a0zr77ik

a0zr77ik1#

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_fields调用get_field_names,然后get_field_names考虑Meta.fields参数。

7cwmlq89

7cwmlq892#

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

相关问题