Django 根据先前的查询选择数据库对象
Posted
技术标签:
【中文标题】Django 根据先前的查询选择数据库对象【英文标题】:Django select database objects based on previous query 【发布时间】:2011-10-31 06:48:17 【问题描述】:我目前正在开展一个项目,其中有 twitter 风格的一种方式关注,我无法弄清楚如何根据用户关注的人在数据库中选择“帖子”。
我正在使用默认用户功能,然后这是我的以下模型:
class Following(models.Model):
user = models.ForeignKey(User, related_name="user")
following = models.ForeignKey(User, related_name="following")
和我的帖子模型:
class Post(models.Model):
title = models.CharField(max_length=100)
text = models.TextField()
user = models.ForeignKey(User)
date_time = models.DateTimeField(auto_now=True)
最后,从我的角度来看,我正在努力工作:
def home(request):
following = Following.objects.filter(user=request.user)
posts = Post.objects.filter(/*not sure what to put here*/)
我整晚都在努力让它工作,但我真的找不到解决方案,所以任何帮助都会很棒。
如果您可能需要查看我未在此处发布的任何内容,github repository for this project is here
【问题讨论】:
如果我理解正确的话,也许你应该遍历视图中的“关注”并获取与每个用户相关的所有帖子。然后将结果附加到列表中。 我认为这可能会奏效,但是如果您关注 x 个人,则必须进行 x 次 sql 查询,我认为这可能对性能非常不利。 是的,但您也可以对 Q 对象使用复杂查找,如 docs.djangoproject.com/en/dev/topics/db/queries/… 中所述。我的意思是,遍历“以下”并创建一个 Q 查询。退出循环后,运行查询。 类似...posts = Post.objects.filter(for follow in followers: Q(user=follow),)
?
对不起,我把你转错了方向。请看下面的答案。
【参考方案1】:
我的 django 开始生锈了,但是这里是:
posts = Post.objects.filter(user__following__user=request.user)
【讨论】:
【参考方案2】:from django.db import transaction
@transaction.commit_manually
def get_posts(following):
posts = []
for f in following:
posts.append(Post.objects.filter(user=f))
transaction.commit()
return posts
def home(request):
following = Following.objects.filter(user=request.user)
posts = get_posts(following)
【讨论】:
以上是关于Django 根据先前的查询选择数据库对象的主要内容,如果未能解决你的问题,请参考以下文章