制作 Q 对象的正确方法,过滤 Django QuerySet 中的所有条目?
The right way to make Q object, which filter all entries in Django QuerySet?
现在我只使用 Q(id=0)
,这取决于数据库。或者 Q(pk__isnull=True)
更好?它对于使用 |
运算符连接 Q 对象很有用。
Q(pk__isnull=True)
更好,因为 PRIMARY KEY
不能包含 NULL
值。某些实例可能有 id=0
.
其实Django QuerySet中有一个特殊的方法。
Model.objects.none()
总是 returns 空查询集并且更容易理解。
查询优化器处理 Q(pk__in=[])
优于 Q(pk__isnull=True)
。例如:
Model.objects.filter(Q(pk__in=[]) # doesn't hit the DB
Model.objects.none() # doesn't hit the db
Model.objects.filter(Q(pk__isnull=True)) # hits the DB
If even 可以处理复杂的查询和波浪号否定:
Model.objects.filter( (Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
# simplifies condition to 'WHERE "hello" = world'
Model.objects.filter( ~(~Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
# simplifies condition to 'WHERE (NOT ("foo" = bar) OR "hello" = world)'
现在我只使用 Q(id=0)
,这取决于数据库。或者 Q(pk__isnull=True)
更好?它对于使用 |
运算符连接 Q 对象很有用。
Q(pk__isnull=True)
更好,因为 PRIMARY KEY
不能包含 NULL
值。某些实例可能有 id=0
.
其实Django QuerySet中有一个特殊的方法。
Model.objects.none()
总是 returns 空查询集并且更容易理解。
查询优化器处理 Q(pk__in=[])
优于 Q(pk__isnull=True)
。例如:
Model.objects.filter(Q(pk__in=[]) # doesn't hit the DB
Model.objects.none() # doesn't hit the db
Model.objects.filter(Q(pk__isnull=True)) # hits the DB
If even 可以处理复杂的查询和波浪号否定:
Model.objects.filter( (Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
# simplifies condition to 'WHERE "hello" = world'
Model.objects.filter( ~(~Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
# simplifies condition to 'WHERE (NOT ("foo" = bar) OR "hello" = world)'