我有2个型号:
class Call(models.Model):
date_time_created = models.DateTimeField(auto_now_add = True)
comment = models.CharField(max_length = 300, blank= True, null=True)
bought_record = models.ForeignKey('BoughtRecords')
class BoughtRecords(models.Model):
date_time_bought = models.DateTimeField(auto_now_add= True)
bought_packet = models.ForeignKey('BoughtPackets')
我写了2个查询:
Q1 = Q(call__result = 1)
{
{1}}
company_for_call = BoughtRecords.objects.exclude(Q1)
我期望这些查询的行为相同。它们生成略有不同的sql-queries(我不擅长原始sql =))。
我想这就是为什么Call并不总是存在于BoughtRecord中,或者可能是Q-objects不适合使用反向外键。请解释一下这种行为,因为我经常从Q-objects编译复杂的查询,有时会得到意想不到的结果。我想知道乍一看结果必须是类似的情况,但实际上是不同的。
答案 0 :(得分:1)
我可以看到,如果使用Q
,INNER_JOIN
有一个WHERE NOT
,而调用exclude
会直接导致查询为nested select
}。在语义上它们是等价的。当INNER JOIN
发生时,NULL
上的foreign_key
引用将被排除。在嵌套查询的情况下,显式指定target_call.bought_record_id = NULL
。所以结果应该没有任何区别。