代码之家  ›  专栏  ›  技术社区  ›  Deniz Dogan

如果没有显式的SQL联接,我将如何做到这一点?

  •  0
  • Deniz Dogan  · 技术社区  · 15 年前

    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)
    

    现在我想要一个查询集 questions 这相当于 Question.objects.all() 但是 包括当前登录用户的答案 . 我几乎完全相信,这可以通过明确的 JOIN

    那我该怎么做呢?

    for q in questions 然后能够看到用户是否通过以下方式回答 q.answered 哪一个可以是布尔值,或者 q.answer 哪一个可能是答案对象本身(或 None

    3 回复  |  直到 15 年前
        1
  •  1
  •   uzi    15 年前

    你在找这样的东西吗?

    [ 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()上的tack,并查看该值是否大于0。

        2
  •  1
  •   ozan    15 年前

    我觉得你想得太多了。基本上,你想知道的(据我所知——如果我错了,请纠正我)是给定用户回答了哪些问题,哪些问题没有(补充)。因此:

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

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

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

    编辑:

    因此,如果要将这两个集合合并到一个列表中,可以使用多种方法,例如创建一个元组列表:

    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])
    

    这并不漂亮,但你明白了——你已经决定了你想要决定什么,这只是一个将它扭曲成你碰巧需要的任何数据结构的问题。

        3
  •  0
  •   Konrad Rudolph    15 年前

    你怎么了

    Question.objects.filter(answer__user=current_user).select_related()