Django过滤器,可能包括None

时间:2017-05-25 19:23:20

标签: python django python-3.x django-models

在过滤值列表时,有没有办法包含None?

>>> MyModel.objects.filter(amount=10).count()
9
>>> MyModel.objects.filter(amount=None).count()
30
>>> MyModel.objects.filter(amount__in=[10]).count()
9
>>> MyModel.objects.filter(amount__in=[None, 10]).count()
9

我希望最后一次调用返回39,而不是9。

在我的实际用例中,无可能包含或不包含在要过滤的值列表中。我可以使用if / else块来检查值列表中的None,并在需要时使用Q对象构造查询,但对大量过滤器这样做会很麻烦。必须有更好的方法,对吧?

1 个答案:

答案 0 :(得分:3)

我认为你需要使用Q对象,可能这样就不会乱七八糟了:

MyModel.objects.filter(Q(amount__isnull=True) | Q(amount__in=the_list)).count()

并且仅在None位于列表中时包含第一部分...

或类似的东西:

query = Q(amount__in=the_list)
if None in the_list:
    query |= Q(amount__isnull=True)

MyModel.objects.filter(query).count()

不确定是否有更好的方法。