django Q对象的奇怪行为

时间:2012-08-20 11:50:33

标签: python django-models

我有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个查询:

  1. Q1 = Q(call__result = 1) {
    {1}}

  2. company_for_call = BoughtRecords.objects.exclude(Q1)

    我期望这些查询的行为相同。它们生成略有不同的sql-queries(我不擅长原始sql =))。

  3. 我想这就是为什么Call并不总是存在于BoughtRecord中,或者可能是Q-objects不适合使用反向外键。请解释一下这种行为,因为我经常从Q-objects编译复杂的查询,有时会得到意想不到的结果。我想知道乍一看结果必须是类似的情况,但实际上是不同的。

1 个答案:

答案 0 :(得分:1)

我可以看到,如果使用QINNER_JOIN有一个WHERE NOT,而调用exclude会直接导致查询为nested select }。在语义上它们是等价的。当INNER JOIN发生时,NULL上的foreign_key引用将被排除。在嵌套查询的情况下,显式指定target_call.bought_record_id = NULL。所以结果应该没有任何区别。