使用Django Rest Framework序列化方法中的数据

4 投票
1 回答
2393 浏览
提问于 2025-04-18 00:57

我在理解 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);它在序列化的时候走了两次,但第二次就出错了。当我把它作为完整的代码块测试时,也不行。你有什么建议我可能做错了什么吗?

1 个回答

3

你试过

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

而不调用任何方法吗?

撰写回答