2016-09-26 3 views
1

Kurzversion: Warum schließt Model.objects.exclude (..__ in = [None]) jedes Objekt aus?Grundlegendes zu Django-Abfragefeldsuche in

Ich habe ein interessantes Verhalten von Django-Feld-Lookup, die ich nicht verstehe. Lassen Sie uns sagen, dass ich 21 Objekte eines bestimmten Modells haben:

>>> Model.objects.count() 
21 

Wenn ich ausschließen einen bestimmten privaten Schlüssel direkt oder mit in Feld Lookup bekomme ich das erwartete Verhalten:

>>> Model.objects.exclude(pk=1).count() 
20 
>>> Model.objects.exclude(pk__in=[1]).count() 
20 

Wenn ich den privaten Schlüssel ausschließen Wert None ich das erwartete Ergebnis:

>>> Model.objects.exclude(pk=None).count() 
21 

Allerdings, wenn ich das gleiche mit dem in Feld Lookup tue nichts, was ich zurück:

>>> Model.objects.exclude(pk__in=[None]).count() 
0 

Warum ist das so?

Antwort

2

Ich vermute, dies liegt an der Art, wie SQL NULL behandelt. Die Abfrage kompiliert zu SELECT COUNT(*) FROM mymodel WHERE NOT (id IN (NULL));.

Siehe zum Beispiel this question für eine Diskussion darüber, warum NOT IN mit NULL immer leer zurückkehrt.

+0

Gute Eins. Höchstwahrscheinlich der Fall. Wusste nicht über 'connection.queries' –