【问题标题】:How to write query for joining two tables in Django?如何编写查询以在 Django 中连接两个表?
【发布时间】:2016-11-24 09:03:12
【问题描述】:

在这里,我想要加入两个表,在 Post 表中增加 like 值,在 UserLikes 表中添加另一行,当前用户为 PostId,has_liked = True。还要检查当前用户是否已经喜欢当前的帖子?下面是我的代码。

models.py

class Posts(models.Model):
    title = models.CharField("Title", max_length=140)
    url = models.FileField("URL")
    likes = models.IntegerField("Likes", default=0)
    by = models.ForeignKey(User)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title + ' by ' + str(self.by)

class UserLikes(models.Model):
    post = models.ForeignKey(Posts)
    user = models.ForeignKey(User)
    has_liked = models.BooleanField("Liked", default=False)

    def __str__(self):
        return str(self.post) + ' by ' + str(self.user)

views.py

def like(request, pk):
    if request.POST :
        post = get_object_or_404(Posts, pk=pk)
        print(request.user)
        obj = UserLikes.objects.filter(post_id__in=post.id, user=request.user)
        try:
            if obj.has_liked is not True:
                obj.post_id = post.id
                obj.user = request.user
                obj.has_liked = True
                obj.save()

            post.likes = str(int(post.likes) + 1)
            post.save()
        except AttributeError:
            return HttpResponse(post.likes)
    else:
        return HttpResponse(post.likes, {'like': 'disabled'})

urls.py

url(r'^(?P<pk>\d+)/like/$', views.like, name='likes'),

那么,views.py 文件中的查询是什么?

【问题讨论】:

    标签: django django-models django-views python-3.5 django-orm


    【解决方案1】:

    Post 模型上的 likes 字段只是复制数据,而不是通过查询获取喜欢的数量,如果您需要大量使用它,甚至可以将其设为 Post 的属性

    @property
    def number_of_likes(self):
        return self.userlikes_set.count()
    

    剩下的就变得微不足道了,只需为此实例添加一个用户喜欢。

    【讨论】:

    • 谢谢@Sayse,但我不明白的是如何限制每个用户只喜欢一次并将其存储在UserLikes 表中。还有如何检索它,即打开索引页面时查询是什么?
    • @CapJ 如果您只想为每个用户、每个帖子点赞,只需在UserLikes 模型中设置unique_together = ('post', 'user')docs.djangoproject.com/en/1.10/ref/models/options/…
    • 感谢@elkubo 帮助了我。
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2018-10-08
    • 2016-07-14
    相关资源
    最近更新 更多