我尝试创建一个嵌套的序列化器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)
我哪里做错了?
1条答案
按热度按时间mspsb9vt1#
可以使用
.data
属性。您必须传递数据,而不是序列化程序对象本身。
data
参数允许您传递数据字典,内部序列化程序将使用该字典创建序列化表示形式。在这种情况下,您将把序列化数据从UserSerializer
和NotificationSerializer传递到UserLoginSerializer
,然后UserLoginSerializer
返回数据的最终序列化表示形式。或者,您可以直接传递用户和通知,如下所示:
Django Rest Framework模型序列化器有一个
to_representation
方法,可以将模型示例转换为字典表示,所以在这种情况下,UserLoginSerializer
会自动使用UserSerializer
和NotificationSerializer
来序列化用户和通知数据。希望这能帮上忙。