【发布时间】:2015-09-18 14:11:17
【问题描述】:
现在我只使用Q(id=0),这取决于 DB。或者Q(pk__isnull=True) 更好?这对于使用| 运算符连接Q 对象很有用。
【问题讨论】:
标签: django django-queryset django-q
现在我只使用Q(id=0),这取决于 DB。或者Q(pk__isnull=True) 更好?这对于使用| 运算符连接Q 对象很有用。
【问题讨论】:
标签: django django-queryset django-q
Q(pk__isnull=True) 更好,因为PRIMARY KEY 不能包含NULL 值。某些实例可能具有id=0。
【讨论】:
其实在 Django QuerySet 中有一个特殊的方法。
Model.objects.none() 始终返回空查询集,更易于理解。
【讨论】:
查询优化器对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)'
【讨论】: