如果值为空,Postgre SQL将忽略筛选条件

如果值为空,Postgre SQL将忽略筛选条件,sql,django,postgresql,django-views,Sql,Django,Postgresql,Django Views,我将以下三个变量传递给查询A、B和C A、 B和C可以接受任何值,包括null 当我运行下面的查询集时,如果A、B或C中的值为null,它应该忽略该条件 queryset = User.objects.values().filter(A_name=A, B_name=B, C_name =C) 例如,如果C值传入null,那么查询的行为应该如下 queryset = User.objects.values().filter(A_name=A, B_name=B) queryset = Use

我将以下三个变量传递给查询
A、B和C

A、 B和C可以接受任何值,包括null

当我运行下面的查询集时,如果A、B或C中的值为null,它应该忽略该条件

queryset = User.objects.values().filter(A_name=A, B_name=B, C_name =C)
例如,如果C值传入null,那么查询的行为应该如下

queryset = User.objects.values().filter(A_name=A, B_name=B)
queryset = User.objects.values().filter(B_name=B)
如果C和一个传入null的值,那么查询的行为应该如下

queryset = User.objects.values().filter(A_name=A, B_name=B)
queryset = User.objects.values().filter(B_name=B)

我不想写所有的9个组合和一个查询。有什么方法可以让我轻松完成吗?

您可以将参数保留为dict,并仅将其中不等于无的参数发送到filter()方法:

arguments = {"A_name": A, "B_name": B, "C_name": C}
arguments_without_null = {k: v for k, v in arguments.items() if v is not None}
queryset = User.objects.values().filter(**arguments_without_null)

最初,创建自己的

类MyManager(models.Manager):
def自定义_过滤器(自身、*args、**kwargs):
filtered_kwargs={key:key的值,kwargs.items()中的值,如果值}
return super().filter(*args,**filtered_kwargs)
然后连接到你的模型中

class MyModel(models.Model):
    objects = MyManager()
    # other model fields
类MyModel(models.Model):
objects=MyManager()
#其他型号字段
现在,将查询集筛选为

queryset = User.objects.values().custom_filter(A_name=A, B_name=SomeNullValue)
queryset=User.objects.values().custom\u过滤器(A\u name=A,B\u name=SomeNullValue)