使用Django ORM,如何执行此INNER JOIN类型的查询?

时间:2010-10-27 05:44:32

标签: django django-models

我一直在寻找这个问题的答案。

我有这些模型的架构

  • 用户。
  • 问题。
  • 用户对问题的回答。

您了解答案中有2个外键:

  • 问题的一个外键
  • 另一个用户

我想获得一个包含2个用户回答的公共问题的行列表,即: 将包含userA和userB的答案的行返回到他们已回答的问题。 (看来这是一个很好的计算方法)

在SQL中,查询如下所示:

$sql = "SELECT <fields...> 
        FROM {votes} AS v1 INNER JOIN {votes} as v2 
        ON (v1.user = %d AND v2.user = %d AND v1.question = v2.question)";

因此,如果userA回答了问题1,2,3,4,5并且userB回答了问题2,4和7,则查询将返回以下行: * v1.user = userA,v1.question = 2,v2.user = userB,v2.question = 2,... * v1.user = userA,v1.question = 4,v2.user = userB,v2.question = 4,...

我用ORM尝试过很多东西,带有'tables'参数的extra()函数被django忽略,没有任何效果。 如何执行这样的查询,没有原始SQL(最多使用extra())?

由于

1 个答案:

答案 0 :(得分:0)

因为我自己和Django相当陌生。到目前为止只需要进行简单的查询,也许我错过了一些东西。但不会

a_ans = Answer.objects.filter(user=a, question__answer__user=b)
b_ans = Answer.objects.filter(user=b, question__answer__user=a)
overall = a_ans|b_ans

做你想要的?或者如果不是这样,将每个限制分为两个单独的过滤器?