Django DRF序列化程序错误:AttributeError:';FeedPostSerializer';对象没有属性';授权用户';
我正在应用程序中创建新闻源 用户已登录并看到其他用户的发布。 因此,我需要两个用户模型(Django DRF序列化程序错误:AttributeError:';FeedPostSerializer';对象没有属性';授权用户';,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我正在应用程序中创建新闻源 用户已登录并看到其他用户的发布。 因此,我需要两个用户模型(user+auth\u users) 现在我想添加一个布尔字段,显示一篇文章是否已经被喜欢 我已经看过这里的文档和其他帖子,但我找不到解决方案。 响应中显示了auth\u user,但我无法将其包含在get\u ready\u like函数中 class NewsPostSerializer(serializers.HyperlinkedModelSerializer): user = UserSer
user
+auth\u users
)
现在我想添加一个布尔字段,显示一篇文章是否已经被喜欢
我已经看过这里的文档和其他帖子,但我找不到解决方案。
响应中显示了auth\u user
,但我无法将其包含在get\u ready\u like
函数中
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',
)
更新:
在另一个例子中,我找到了一个解决办法。我的代码现在看起来像这样,并且可以工作:
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,我会稍微改变一下这里的方法。对于like计数器,我会在数据库中使用类似模型的东西,它有一个外键指向图片,另一个外键指向用户,有了外键,您可以使用模型之间的反向关系。例如:
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')
因此,我建议在用户的模型中插入like的计数器,然后您可以在序列化程序中使用它。您的
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
嗨,马可,首先谢谢你的回答!我已经有一个喜欢的模型了<代码>类LikePost(models.Model):user=models.ForeignKey(user,related\u name='like\u post\u user',on\u delete=CASCADE,null=True)post=models.ForeignKey(post,related\u name='like\u post',on\u delete=CASCADE,null=True)time\u stamp=models.datetime字段(auto\u now=True)My probelm当前的问题是获取正在使用并希望接收feedHi的用户的ID,感谢您在这方面的支持!我尝试了您的解决方案,但出现了以下问题:“Post”对象没有属性“auth_user”,请求不包含任何值。我最大的问题是获取auth_user。当我硬编码所有ID时,一切都正常
Post
对象没有属性auth\u user
,因为您提到它是meta类中的只读字段。request.data应该包含这些,我已经对此进行了评论。如果你发布数据的话。request.data.get('auth_user')应该包含auth_user.Hi Shaki,感谢您的快速响应。我试了你的建议。”request.data.get('auth_user')为我提供的是None,而不是用户idfirst-removeauth_user
fromread_-only\u fields
。你能用post数据(可能是邮递员的屏幕截图)和你的更新代码更新你的问题吗。这将帮助我们指出故障。嗨,Shakil。我找到了解决办法。请看更新后的帖子。谢谢你的支持!