如何使用 Django 模型以更有效的方式获取此查询集?
How can I get this query-set in a more efficient way using Django models?
我的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')]
让我解释一下我的投票系统是如何设置的。当用户第一次为 post 投票时,将创建一个新的 Vote 对象。如果用户先投了票,他可以否决 post。在这种情况下,投票对象中的 is_voted 属性 设置为 False。
现在在视图中,我需要用户已投票的帖子列表。这意味着 post 和用户组合的投票对象存在,并且该对象的 is_voted 属性 为真。
这是我目前正在尝试的方法:
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,但我不确定该怎么做。
我认为这个查询集应该给出用户点赞的所有帖子(虽然我还没有尝试过):
votes = Post.objects.filter(post_votes__user=u, post_votes__is_voted=True)
这是模型的反向查找,将外键指向包含它的模型。
你可以试试这个:
post_list = [p.post for p in Vote.objects.filter(user = u, is_voted = True).select_related('post')]
我的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')]
让我解释一下我的投票系统是如何设置的。当用户第一次为 post 投票时,将创建一个新的 Vote 对象。如果用户先投了票,他可以否决 post。在这种情况下,投票对象中的 is_voted 属性 设置为 False。
现在在视图中,我需要用户已投票的帖子列表。这意味着 post 和用户组合的投票对象存在,并且该对象的 is_voted 属性 为真。
这是我目前正在尝试的方法:
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,但我不确定该怎么做。
我认为这个查询集应该给出用户点赞的所有帖子(虽然我还没有尝试过):
votes = Post.objects.filter(post_votes__user=u, post_votes__is_voted=True)
这是模型的反向查找,将外键指向包含它的模型。
你可以试试这个:
post_list = [p.post for p in Vote.objects.filter(user = u, is_voted = True).select_related('post')]