DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”
Posted
技术标签:
【中文标题】DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”【英文标题】:DRF Serializer Error: AttributeError: 'FeedPostSerializer' object has no attribute 'auth_user' 【发布时间】:2020-01-12 08:11:38 【问题描述】:我正在 APP 中创建新闻源。
一个用户登录并看到其他用户的帖子。
因此我需要两个用户模型(user
+ auth_users
)
现在我想添加一个布尔字段来显示帖子是否已被点赞。
我已经查看了此处的文档和其他帖子,但找不到解决方案。
auth_user
显示在响应中,但我不能将它包含在 get_already_liked
函数中
class NewsPostSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer(read_only=True)
auth_user = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault()
)
attachments = AttachmentSerializer(read_only=True, many=True)
already_liked = serializers.SerializerMethodField()
def get_already_liked(self, request):
liking_kwargs =
'post_id': request.id,
'user_id': self.auth_user
if LikePost.objects.filter(**liking_kwargs).exists():
return True
else:
return False
class Meta:
model = Post
read_only_fields = (
'id', "user", 'creation_time_stamp', 'auth_user', 'ready_liked',
)
fields = (
'id', 'user', 'creation_time_stamp', 'last_update_time_stamp',
'description', 'attachments', 'already_liked', 'auth_user',
)
更新: 在另一个post 中,我找到了解决方案。我的代码现在看起来像这样并且可以工作:
class NewsPostSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer(read_only=True)
attachments = PostAttachmentSerializer(read_only=True, many=True)
already_liked = serializers.SerializerMethodField()
def get_already_liked(self, obj):
user = self.context['request'].user.id
liking_kwargs =
'post_id': obj.id,
'user_id': user
if LikePost.objects.filter(**liking_kwargs).exists():
return True
else:
return False
class Meta:
model = Post
read_only_fields = (
'id', "user", 'creation_time_stamp', 'attachments', 'already_liked',
)
fields = (
'id', 'user', 'creation_time_stamp', 'last_update_time_stamp',
'description', 'attachments', 'already_liked',
)
感谢 Marco 和 Shakil
【问题讨论】:
【参考方案1】:我会稍微改变一下这里的方法。对于类似的计数器,我会使用数据库中的模型之类的东西,该模型具有图片的外键和用户的另一个外键,您可以使用模型之间的反向关系。例如:
class Post(models.Model):
...
...
def number_of_likes(self):
return len(self.likes.all()) # dont know if sintax is right, but the idea is to get all the instance of likes that is related to this post. (reverse relation)
class Like(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE ,related_name='likes')
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='all_likes')
所以,我建议在用户模型中插入点赞计数器,然后您可以在序列化程序中开始使用它。
【讨论】:
嗨,Marco,首先感谢您的回答!我已经有一个喜欢的模型了。class LikePost(models.Model): user = models.ForeignKey(User, related_name='like_post_user', on_delete=CASCADE, null=True) post = models.ForeignKey(Post, related_name='like_post', on_delete=CASCADE, null=True) time_stamp = models.DateTimeField(auto_now=True)
我的problem目前是获取登录并希望接收feed的用户的ID【参考方案2】:
您的serializerMethodField
的论点是错误的。应该是这样的
def get_already_liked(self, obj):
request = self.context.get('request')
liking_kwargs =
'post_id': request.id, // I have a doubt, is this request.data['id']
'user_id': obj.auth_user
if LikePost.objects.filter(**liking_kwargs).exists():
return True
else:
return False
【讨论】:
您好,感谢您对此的支持!我尝试了您的解决方案,但出现了以下问题: 'Post' 对象没有属性 'auth_user' 并且请求不包含任何值 我最大的问题是获取 auth_user。当我对所有 ID 进行硬编码时,一切正常Post
对象没有属性auth_user
,因为您提到它是元类中的read_only_fields
。 request.data 应该包含那些,我已经对此发表了评论。如果您发布数据,那么 . request.data.get('auth_user') 应该包含 auth_user。
嗨,Shaki,感谢您的快速回复。我尝试了你的建议。 ' request.data.get('auth_user') ' 给我 None 而不是用户 ID
首先从read_only_fields
中删除auth_user
。您能否使用帖子数据(可能是邮递员的屏幕截图)和更新的代码来更新您的问题。这将有助于我们指出错误。
嗨沙基尔。我找到了解决方案。请查看更新后的帖子。感谢您的支持!以上是关于DRF 序列化程序错误:AttributeError:“FeedPostSerializer”对象没有属性“auth_user”的主要内容,如果未能解决你的问题,请参考以下文章