没有明确的SQL JOIN,我该怎么做?

时间:2009-04-15 08:59:42

标签: django

我有一个名为Question的模型,另一个名为Answer。

class Question(models.Model):
    text = models.CharField(max_length=140)

class Answer(models.Model): 
    user = models.ForeignKey(User)
    question = models.ForeignKey(Question)
    uncertain = models.BooleanField()
    text = models.CharField(max_length=30)

现在我想要一个QuerySet questions,它等同于Question.objects.all(),但包括当前登录用户的答案。我几乎完全相信这可以通过SQL中的显式JOIN来完成,但我确信有更好的方法可以使用Django的ORM来实现这一点。

那我该怎么做?

编辑:为了澄清,我希望能够遍历QuerySet,例如: for q in questions然后能够看到用户是否通过q.answered可能是布尔值的内容来回答它,或者q.answer可能是Answer对象本身(或{{ 1}})。

3 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

[ item.question for question in Answer.objects.filter(user=request.user) ]

或许你想做一个

questions = Question.objects.all()
for question in questions:
    question.answer = question.answer_set.filter(user=request.user)

我想我不理解你想去的问题和方向......

编辑:好的,根据您的编辑,也许是后者...您可以看到它是一个空列表还是大写的.count()并查看该值是否大于0.

答案 1 :(得分:1)

我认为你是在过度思考。基本上你想知道的(据我所知 - 如果我错了,请纠正我)是哪个问题已由特定用户回答,哪些问题没有(补充)。所以:

user_answered_questions = set([answer.question for answer in user.answer_set.all()])

然后未解决的问题就是其他一切。所以:

user_unanswered_questions = set(Question.objects.all()) - answered_questions

这样做而不是uzi的解决方案是你应该尽早使用你所知道的。如果您按用户筛选每个问题的answer_set,则初始查询将选择这些表中的每个答案和每个问题。通过从已知数据(即用户)开始,我们仅选择与该用户相关的答案和问题。

编辑:

因此,如果您想将这两个集合组合到一个列表中,有很多方法可以通过创建元组列表来实现这一点:

questions = [(q, q in user_answered_questions) for q in Question.objects.all()]

然后你可以迭代问题,保留查询集的顺序:

for q in questions:
    print "it is %s that this user answered the \"%s\" question" % (q[1], q[0])

它并不漂亮,但你明白了 - 你已经确定了你想要确定的内容,只是将它扭曲到你碰巧需要的任何数据结构。

答案 2 :(得分:0)

有什么问题
Question.objects.filter(answer__user=current_user).select_related()