我想知道是否有一种方法可以根据所过滤的值是否为None
来有条件地过滤Django中的查询集。我知道您可以执行以下操作:
some_name = 'Bob'
qs = MyModel.objects.filter(gender='boy')
if some_name:
qs = qs.filter(name=some_name)
我们仅在变量some_name
存在的情况下有条件地对其进行过滤。我很好奇这个逻辑是否可以用一个查询语句复制,而不是在过滤器上“链接”到查询集的末尾。所以看起来像这样:
qs = MyModel.objects.filter(gender='boy').filter(name=some_name if some_name else None)
显然,该示例无效,因为它会根据name = None进行过滤,而不是不进行过滤,但是有人找到了一种执行我想要的方法的方法吗?对于更长的嵌套查询,将所有内容放在一个语句中将非常有帮助。
答案 0 :(得分:1)
我不相信在Django中有专门的内置方法来执行此操作,但是您可以利用字典解包运算符**
和字典理解来获得所需的结果。
例如:
some_name = 'Bob'
field_value_pairs = [('gender', 'boy'), ('name', some_name)]
filter_options = {k:v for k,v in field_value_pairs if v}
qs = MyModel.objects.filter(**filter_options)
因此,如果some_name
为None
,则'name'
字段将从filter_options
中排除,因此不包含在过滤器查询中。