制作Q对象的正确方法,它过滤Django QuerySet中的所有条目?

时间:2015-07-01 12:13:34

标签: django django-queryset django-q

现在我只使用Q(id=0),这取决于数据库。或者Q(pk__isnull=True)可能更好?对于使用|运算符的串联Q对象非常有用。

3 个答案:

答案 0 :(得分:3)

Q(pk__isnull=True)更好,因为PRIMARY KEY不能包含NULL值。有些实例可能有id=0

答案 1 :(得分:1)

查询优化器比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

如果甚至适用于复杂的查询和波浪号取反:

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

答案 2 :(得分:0)

实际上,Django QuerySet中有一个特殊的方法。 Model.objects.none()始终返回空查询集,并且更易于理解。