Django:按[无,其他]

时间:2019-03-25 14:02:05

标签: python django

在此线程中,我有与OP相同的问题:Django - filtering by "certain value or None"

  

我在数据对象中有一个字段,该字段可以为null或设置为   一些整数。我想给定一个整数,以过滤所有对象   该整数值或无:

MyElements.objects.all().filter(value__in=[myInt, None]) # Query 1
     

但是,此行不适用于具有空值的元素。更多   恰好:

MyElements.objects.all().filter(value__in=[None]) # Query 2
     

不返回任何内容。而

MyElements.objects.all().filter(value = None) # Query 3
     

返回空值元素。

     

如何正确重写原始查询(涉及myInt)?

我知道OP已经接受了答案,但是我想知道为什么 Query 2没有产生任何结果。

2 个答案:

答案 0 :(得分:2)

它基于用于执行的SQL规则。 NULL值不是要比较的实际值。这是一个未知的价值。

在此处详细了解:is null vs == null

在Django中,您可以获得带有NULL值的记录,如下所示:

MyElements.objects.filter(value__isnull = True)

因此,您需要先从比较列表中过滤None,然后自己将其添加到查询中。

from django.db.models import Q
MyElements.objects.filter(Q(value__in = [list_of_vals]) | Q(value__isnull = True))

答案 1 :(得分:1)

您应该使用isnull过滤器来测试字段是否为空;否则,在SQL中,与空值相比的任何值都将始终为false:

from django.db.models import Q
MyElements.objects.filter(Q(value=myInt) | Q(value__isnull=True))