制作 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)'