我有一个queryset它过滤2个变量
family = ModelsClass.objects.filter(foo=var1).filter(bar=var2)
如果var1和var2不为空,则一切正常,但var1和var2可以为空。在这种情况下,我需要排除空的。例如,如果var1为Null,则它必须仅按var2过滤,反之亦然。有没有办法在过滤器查询集中插入if条件或者其他什么?运输
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)
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来排除空字符串。
if v
if v is not None
fhg3lkii3#
另一种方法using QQ对象将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)
3条答案
按热度按时间fcipmucu1#
为什么不先检查变量是否为空,然后过滤它呢?你不必在一行中完成,Django的queryset对象是惰性求值的,你可以在单独的行中过滤或做其他事情。
ma8fv8wu2#
更一般地说,您可以创建一个筛选字典,并使用字典解析筛选字典键中的空值。
例如,您甚至可以使用
if v
代替if v is not None
来排除空字符串。fhg3lkii3#
另一种方法using Q
Q对象将SQL表达式封装在Python对象中,可以用于数据库相关的操作。使用Q对象,我们可以用更少和简单的代码进行复杂的查询。