0

私は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)
    company_for_call = BoughtRecords.objects.exclude(Q1)

  2. company_for_call = BoughtRecords.objects.exclude(call__result = 1)

    このクエリからも同じ動作を期待していました。それらはわずかに異なるsql-queriesを生成します(私は生のsql =が得意ではありません))。

BoughtRecordに対してCallが常に存在するとは限らない、またはQオブジェクトが後方外部キーで適切に機能しない可能性があるのはそのためだと思います。Qオブジェクトから複雑なクエリをコンパイルすることが多く、予期しない結果が生じることがあるため、この動作を説明してください。一見すると結果が似ているはずなのに、実際には違うという状況を知りたい。

4

1 に答える 1

1

を使用する場合QINNER_JOINwith a WHERE NOTwhile を直接呼び出すとexclude、クエリが aになることがわかりますnested select。意味的には同等です。がINNER JOIN発生した場合、NULL上の参照foreign_keyは除外されます。ネストされたクエリtarget_call.bought_record_id = NULLが明示的に指定されている場合。したがって、結果に違いはないはずです。

于 2012-08-20T14:59:56.090 に答える