在Django Queryset中有条件地过滤

时间:2018-07-31 20:57:50

标签: python django

我想知道是否有一种方法可以根据所过滤的值是否为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进行过滤,而不是不进行过滤,但是有人找到了一种执行我想要的方法的方法吗?对于更长的嵌套查询,将所有内容放在一个语句中将非常有帮助。

1 个答案:

答案 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_nameNone,则'name'字段将从filter_options中排除,因此不包含在过滤器查询中。