我正在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
答案 0 :(得分:0)
我会在这里稍微改变一下方法。对于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')
因此,我建议在用户模型中插入点赞计数器,然后您可以在序列化器中开始使用它。
答案 1 :(得分:0)
您的?method
的论点是错误的。应该是这样
serializerMethodField