【问题标题】:How can I get this query-set in a more efficient way using Django models?如何使用 Django 模型以更有效的方式获取此查询集?
【发布时间】:2016-04-30 21:58:18
【问题描述】:

我的 models.py 如下所示:

class Post(models.Model):
    user = models.ForeignKey(User, related_name = 'user_posts')
    title = models.CharField(max_length = 140)
    votes = models.IntegerField(default = 0)

class Vote(models.Model):
    user = models.ForeignKey(User, related_name = 'user_votes')
    post = models.ForeignKey(Post, related_name = 'post_votes')
    is_voted = models.BooleanField(default = True)
    class Meta:
        unique_together = [('user', 'post')]

让我解释一下我的投票系统是如何设置的。当用户第一次为帖子投票时,会创建一个新的 Vote 对象。如果用户先投票,则用户可以对帖子投反对票。在这种情况下,Vote 对象中的 is_voted 属性设置为 False。

现在在一个视图中,我需要一个用户已投票的帖子列表。这意味着帖子和用户组合的 Vote 对象存在,并且该对象的 is_voted 属性为 True。

这是我目前正在尝试的方式:

views.py

def user_profile(request, pk):
    # Get user using pk
    u = User.objects.get(pk = pk)

    # Get a list of Votes using the user instance
    votes = Vote.objects.filter(user = u, is_voted = True)

    # Getting the list of posts using the votes list
    post_list = Post.objects.none() # Generating empty list
    for vote in votes:
        # Adding vote.post to post_list using chaining.
        .....

这确实有效,但感觉非常hack-y。有没有办法在没有 for 循环的情况下生成查询集?我猜我可以使用related_name,但我不知道该怎么做。

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    我认为这个查询集应该给出用户赞成的所有帖子(虽然我还没有尝试过):

    votes = Post.objects.filter(post_votes__user=u, post_votes__is_voted=True)
    

    这是从模型到将外键指向包含它的模型的反向查找。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      post_list = [p.post for p in Vote.objects.filter(user = u, is_voted = True).select_related('post')]
      

      【讨论】:

        猜你喜欢
        • 2023-01-07
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多