在django-rest-framework中使用嵌套序列化程序时出现问题

sulc1iza  于 2023-02-14  发布在  Go
关注(0)|答案(1)|浏览(156)

我尝试创建一个嵌套的序列化器UserLoginSerializer,它由一个UserSerializer和一个NotificationSerializer组成,但是当它尝试序列化时,我收到了这个错误:
属性错误:尝试获取序列化程序UserSerializer上的字段email的值时出现AttributeError。序列化程序字段的名称可能不正确,并且与UserSerializer示例上的任何属性或键都不匹配。原始异常文本为:"UserSerializer"对象没有属性"email"。
这是我的网站models.py:

class Notification(models.Model):
    kind = models.IntegerField(default=0)
    message = models.CharField(max_length=256)

class User(AbstractUser):
    username = models.CharField(max_length=150, blank=True, null=True)
    email = models.EmailField(unique=True)
    customer_id = models.UUIDField(default=uuid.uuid4, editable=False)

我的网站serializers.py:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = [
            "id",
            "first_name",
            "last_name",
            "email",
            "customer_id"
        ]

class NotificationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Notification
        fields = [
            "id",
            "kind",
            "message",
        ]

class UserLoginSerializer(serializers.Serializer):
    user_info = UserSerializer(read_only=True)
    notifications = NotificationSerializer(many=True, read_only=True)

错误发生在此端点的最后一行:

def get_login_info(self, request):
    notifications = Notification.objects.filter(recipient=request.user)
    serializer = UserLoginSerializer(
        {
            "user_info": UserSerializer(request.user),
            "notifications": NotificationSerializer(notifications, many=True),
        }
    )
    return Response(serializer.data)

我哪里做错了?

mspsb9vt

mspsb9vt1#

可以使用.data属性。

def get_login_info(self, request):
    notifications = Notification.objects.filter(recipient=request.user)
    serializer = UserLoginSerializer(
        {
            "user_info": UserSerializer(request.user).data,
            "notifications": NotificationSerializer(notifications, many=True).data,
        }
    )
    return Response(serializer.data)

您必须传递数据,而不是序列化程序对象本身。data参数允许您传递数据字典,内部序列化程序将使用该字典创建序列化表示形式。在这种情况下,您将把序列化数据从UserSerializer和NotificationSerializer传递到UserLoginSerializer,然后UserLoginSerializer返回数据的最终序列化表示形式。
或者,您可以直接传递用户和通知,如下所示:

def get_login_info(self, request):
    notifications = Notification.objects.filter(recipient=request.user)
    serializer = UserLoginSerializer(
        {
            "user_info": request.user,
            "notifications": notifications
        }
    )
    return Response(serializer.data)

Django Rest Framework模型序列化器有一个to_representation方法,可以将模型示例转换为字典表示,所以在这种情况下,UserLoginSerializer会自动使用UserSerializerNotificationSerializer来序列化用户和通知数据。
希望这能帮上忙。

相关问题