【问题标题】:Serializing data from a method using Django Rest Framework使用 Django Rest Framework 从方法中序列化数据
【发布时间】:2014-05-13 02:14:29
【问题描述】:

我无法理解Django Rest Framework 在序列化数据时如何处理相关模型实例。

例如,我有两个模型都与 django `User' 相关:

from django.contrib.auth.models import User
from django.db import models

class UserStatus(models.Model):
    user = models.ForeignKey(User)
    created = CreationDateTimeField()

    def is_anonymous(self):
        return self.user.userprofile.anonymous_user


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    anonymous_user = models.BooleanField(default=False)

如果我使用以下方法序列化模型实例,它可以正常工作:

from rest_framework import serializers

class UserStatusSerializer(serializers.ModelSerializer):
    get_anonymous = serializers.SerializerMethodField('get_anonymous_state')

    def get_anonymous_state(self, obj):
        return self.object.user.userprofile.anonymous_user

    class Meta:
        model = UserStatus
        fields = ('id', 'get_anonymous',)

我调用序列化程序的视图结构如下:

def put(self, request, *args, **kwargs):
        user = self.request.user
        serializer = UserStatusSerializer(self.model.objects.filter(user=user, data=request.DATA)

        if serializer.is_valid():
                new_serializer = UserStatusSerializer(user)
                return Response(new_serializer.data, status=status.HTTP_200_OK)

如果我尝试使用模型 UserStatus 上存在的方法,我会收到错误:

class UserStatusSerializer(serializers.ModelSerializer):
    is_anonymous = serializers.Field(source='is_anonymous')

    class Meta:
        model = UserStatus
        fields = ('id', 'is_anonymous',)

在第二种方法中,我收到错误消息:

Exception Value: UserStatus has no user

我真的不明白发生了什么。如果我设置跟踪并逐行遍历PUT请求,它工作正常并且存在正确的关系(例如,我在方法中,我可以访问self.user.userprofile.anonymous_user);它两次执行序列化,第二次中断。当我让我将它作为一个完整的代码块进行测试时,它也不起作用。关于我做错了什么有什么建议吗?

【问题讨论】:

    标签: python django rest methods django-rest-framework


    【解决方案1】:

    你试过了吗

    is_anonymous = serializers.Field(source='user.userprofile.is_anonymous')
    

    不调用方法?

    【讨论】:

    • 如果在方法中添加@property,上面的答案是有效的
    猜你喜欢
    • 2018-06-04
    • 2016-04-10
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2021-09-10
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多