Python 仅使用Django选择相关对象的子集

Python 仅使用Django选择相关对象的子集,python,django,django-models,Python,Django,Django Models,考虑以下模型: class Question(models.Model): ... class Answer(models.Model): user = models.ForeignKey('auth.User') question = models.ForeignKey(Question) answer = models.TextField(...) class Meta: unique_together = ('user', 'que

考虑以下模型:

class Question(models.Model):
    ...

class Answer(models.Model):
    user = models.ForeignKey('auth.User')
    question = models.ForeignKey(Question)
    answer = models.TextField(...)
    class Meta:
        unique_together = ('user', 'question'),
现在,在一个视图中,我想重复一些问题,并使用request中唯一可能存在的答案。类似于用户:

questions = Questions.objects.filter(...).iterator()
for q in questions:
    try:
        a = Answer.objects.get(user=request.user, question=q)
    except Answer.DoesNotExist:
        a = None
    do_something_with(a)
这将导致OQuestions数据库命中。我可以使用,但我看不到将预取值限制为user=request.user的答案的方法,而且在一个有很多用户的站点上,预取所有用户的答案需要相当大的内存

我认为这些信息可以在一个查询中检索到。我还没有测试它,但我希望下面这样的东西能起作用:

questions = Questions.objects.extra(select={'user_answer': 'SELECT id, answer from answer where answer.user.id = %s', }, params=(request.user.id,))
如果没有可用的答案,则不确定其行为

Questions.objects.filteranswer\u_user=request.user不工作,因为它跳过request.user没有相关答案的问题

还可以使用以下两个查询:

questions = Question.objects.filter(...).all()
users_answers = Answer.objects.filter(user=request.user, question__in=questions)
users_answers = dict((a.id, a) for a in users_answers)
for q in questions:
    a = users_answers.get(q.id)
如果存在许多与所用过滤器匹配的问题,则效率低下


有没有一种更具Python风格的方式不强迫我编写SQL,更易于编写和阅读,并且仍然比第一种在Python循环中逐个获取答案的变体更高效?

您能澄清这个问题吗?只是你想让某个用户回答某个问题;然后是这些答案中的问题?@JohnMee我想呈现一个所有问题的列表以及请求。用户的答案。因此,上面的a是q.usersanswer=a,然后给出了一些问题。这是否足够清楚?