在过滤值列表时,有没有办法包含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对象构造查询,但对大量过滤器这样做会很麻烦。必须有更好的方法,对吧?
答案 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()
不确定是否有更好的方法。