python Django中的增量整型字段

imzjd6km  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(153)

我正在创建一个简单的博客应用程序,并希望用户能够喜欢一个职位。
就可伸缩性而言,我决定最好将喜欢作为一个单独的表,由指向用户和帖子的指针组成。
我已经设法启用了帖子请求,向模型添加了一个类似的内容,但是帖子模型中的likes字段没有增加。
我尝试过在序列化器中使用一个简单的likes += 1技术,但没有做任何改变,现在使用了一个F字符串,但仍然没有做任何改变。我对Django还很陌生,我怀疑这可能是因为我试图在CreateAPIView序列化器中更新一个不同模型上的字段,但我不确定。
这是我目前掌握的情况
第一个
谢谢你

ljsrvy3e

ljsrvy3e1#

您只能在执行查询时使用F()

post = Post.objects.get(id=post_id)
post.likes = post.likes + 1
post.save()

或者如果你不介意多做一个查询,还要确保帖子的赞数始终正确:

post = Post.objects.get(id=post_id)
post.likes = Like.objects.filter(post=post).count()
post.save()
63lcw9qa

63lcw9qa2#

赞没有更新的主要原因是,您在LikeView中写道
def like(self, request, format=None):
代替
def post(self, request, *args, **kwargs):
更新视图,如下所示:

class LikeView(generics.CreateAPIView):
    permission_classes = [
        permissions.IsAuthenticated,
    ]
    queryset = Like.objects.all()
    serializer_class = LikeSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        if (serializer.is_valid()):
            like = serializer.save()
            post = like.post_id
            post.likes = post.post_id.count()
            post.save()

            return Response(LikeSerializer(like).data,
                            status=status.HTTP_200_OK)
        return Response(serializer.errors(),
                        status=status.HTTP_400_BAD_REQUEST)

在上面的代码中,您将Like对象保存到变量like中,然后获取post对象,并使用post外键的related name找到计数。
此外,您的模型结构允许一个用户多次赞一个帖子。为了防止这种情况,您可以将唯一的一起添加到赞模型中。

class Like(models.Model):
    user_id = models.ForeignKey(User, related_name='user_id', on_delete=models.CASCADE)
    post_id = models.ForeignKey(Post, related_name='post_id', on_delete=models.CASCADE)

    def __str__(self):
        return "%s %s" % (self.user_id, self.post_id)

    class Meta:
        unique_together = ('user_id', 'post_id',)

相关问题