【发布时间】:2013-11-19 08:54:29
【问题描述】:
使用Q 对象创建查询集时遇到问题。我得到不同的结果取决于我如何订购一些Q 条件。我将稍微简化我的模型,以便以简洁的方式描述我的问题。
class D(models.Model):
one_attr = models.BooleanField()
s_attr = models.ManyToManyField(S, through='DRelatedToS')
d_to_p = models.ForeignKey(P)
class S(models.Model):
other_attr = models.BooleanField()
s_to_p = models.ForeignKey(P)
class DRelatedToS(models.Model):
to_s = models.ForeignKey(S)
to_d = models.ForeignKey(D)
date = models.DateField()
class P(models.Model):
the_last_attr = models.PositiveIntegerField()
关系总结:
D <-- DRelatedToS --> S --> P | ^ | | -------->------->------>----^
使用这些模型和关系,我得到两个不同的结果,具体取决于我如何安排 Q 条件: 第一个查询,给出一个结果
D.objects.filter(
Q(one_attr=True, s_attr__s_to_p__the_last_attr=5)
|
Q(one_attr=False, d_to_p__the_last_attr=10)
)
第二次查询,给出另一个结果,不同于第一次查询
D.objects.filter(
Q(one_attr=False, d_to_p__the_last_attr=10)
|
Q(one_attr=True, s_attr__s_to_p__the_last_attr=5)
)
我的问题是:为什么会这样?我的查询方式有什么问题吗?
当我查看从这些查询派生的 SQL 语句时,我得到两个不同的语句:一个生成 LEFT OUTER JOIN 和很多 INNER JOINs,第二个生成所有 INNER JOINs。真正返回我想要的东西是制作LEFT OUTER JOIN 的那个。这让我觉得我的所有查询都可能返回糟糕的结果,具体取决于我如何安排它的条件。这是一个错误还是我做错了什么(或一切)?
【问题讨论】:
-
简化模型是Good Thing™
标签: django django-queryset django-q