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 根据先前的查询选择数据库对象的主要内容,如果未能解决你的问题,请参考以下文章

与 django 查询集注释中的先前对象的区别

Django ORM查询无法选择新对象

Django Admin 根据其他选择动态禁用字段

Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)

如何检索先前查询的查询执行时间

ActiveRecord 按顺序查询对象子集