Django仅在变量不为空时过滤queryset

hiz5n14c  于 2022-11-26  发布在  Go
关注(0)|答案(3)|浏览(236)

我有一个queryset它过滤2个变量

family = ModelsClass.objects.filter(foo=var1).filter(bar=var2)

如果var1和var2不为空,则一切正常,但var1和var2可以为空。在这种情况下,我需要排除空的。
例如,如果var1为Null,则它必须仅按var2过滤,反之亦然。
有没有办法在过滤器查询集中插入if条件或者其他什么?
运输

fcipmucu

fcipmucu1#

为什么不先检查变量是否为空,然后过滤它呢?你不必在一行中完成,Django的queryset对象是惰性求值的,你可以在单独的行中过滤或做其他事情。

family_queryset = ModelClass.objects.all()

if var1:
    family_queryset = family_queryset.filter(foo=var1)

if var2:
    family_queryset = family_queryset.filter(bar=var2)
ma8fv8wu

ma8fv8wu2#

更一般地说,您可以创建一个筛选字典,并使用字典解析筛选字典键中的空值。

filters = {
  'foo': var1,
  'bar': var2,
}
filters = {k:v for k,v in filters.items() if v is not None}
family_queryset = ModelClass.objects.filter(**filters)

例如,您甚至可以使用if v代替if v is not None来排除空字符串。

fhg3lkii

fhg3lkii3#

另一种方法using Q
Q对象将SQL表达式封装在Python对象中,可以用于数据库相关的操作。使用Q对象,我们可以用更少和简单的代码进行复杂的查询。

filters = Q()
if my_first_param:
   filters &= Q(my_first_param=my_first_param)
if my_second_param:
   filters &= Q(my_second_param=my_second_param)

# Perform filtration
family_queryset = ModelClass.objects.filter(filters)

相关问题