2017-02-21 46 views
0

我试图找到一个属性设置为None或空字符串的模型之一的所有实例。我想我错过了ORM的__in查询。“Q”与“__in”不一致的Django ORM查询结果

TextBlock.objects.filter(content='').count() 
>185 
TextBlock.objects.filter(content=None).count() 
>235 
TextBlock.objects.filter(content__in=['', None]).count() 
>185 
TextBlock.objects.filter(Q(content='')|Q(content=None)).count() 
>420 
TextBlock.objects.filter(content__in=[None, '']).count() 
>185 

当我这样做有IntegerFIeld和不使用无或空字符串,我得到:

TextBlock.objects.filter(order=1).count() 
> 575046 
TextBlock.objects.filter(order=2).count() 
> 11946 
TextBlock.objects.filter(order__in=[1,2]).count() 
> 586992 

这是我所期待的。期待TextBlock.objects.filter(content__in=['', None]).count()返回420个结果,我错了吗?如果是这样,为什么?

Q查询做我想要的,所以我最终会去,但我仍然好奇为什么第三个查询没有做我想要的。

谢谢!

编辑:如果它的确与众不同,但内容领域是models.TextField和顺序字段是models.IntegerField

回答

2

注意NULL == NULL在SQL中实际上是错误的,并且您需要使用IS NULL来检查值是否为空。 Django足够聪明,可以将Q(content=None)转换为IS NULL声明,这就是为什么TextBlock.objects.filter(Q(content='')|Q(content=None)).count()可以返回您所期望的结果。

一个IN语句只能比较一个值与它的元素,它不能做一个IS NULL检查。要检查空值,您需要明确添加content=None或等效的content__isnull=True

使用__in的查询应按预期方式对任何不包括NULL的值列表工作。

0

用于检查内容是无你不应该使用比较不知道。 你必须使用content__isnull在ORM (你可以像你正在做的Q对象合并查询)

0

您检查使用isnull现场查找None值:

TextBlock.objects.filter(Q(content='')|Q(content__isnull=True)).count()