我有一个名为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}})。
答案 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()