参数为空时的Django查询

12 投票
5 回答
12340 浏览
提问于 2025-04-16 23:15

我想做一个查询,类似于

Model.objects.filter(x=x).filter(y=y).filter(z=z) 

...但是有些情况下,比如y是None。这实际上是在数据库中查找y列的空值——有没有什么聪明的方法可以在y是None的时候忽略这个查询参数,也就是说返回这个查询集

Model.objects.filter(x=x).filter(z=z)?

5 个回答

4

这是一个比@rolling-stone的回答更好的方法,虽然那个回答已经很清晰了:

models = Model.objects.all()

variables = {'x':x,'y':y,'z':z}

for key, value in variables.items():
    if value is not None:
        models = models.filter(**{key: value})

无论如何,根据具体的过滤条件,你需要在同一个.filter()调用中一起应用多个过滤器,所以“盲目”的方法只适用于简单的情况。想了解更多这方面的信息,可以查看这个链接:https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships

5

像这样可能会有效:

models = Model.objects.all()

variables = {'x':'x','y':'y','z':'z'}

for key, value in variables.items():
    if key=='x' and value:
        models = models.filter(x=value)
    if key=='y' and value:
        models = models.filter(y=value)
    if key=='z' and value:
        models = models.filter(z=value)

因为查询集是懒惰的,所以这并不会涉及到任何数据库的操作。

19

我不太确定我是否理解你的问题,不过

Model.objects.filter(x=x, y__isnull = False, z=z)

这段代码会给你一个查询结果,里面的 y 列是非空的(也就是 IS NOT NULL)。

这里有相关的文档可以参考。

编辑:检查一下 y 是否为 None,然后动态构建你的查询结果:

if y is None:
    qs = Model.objects.filter(x=x).filter(z=z)
elif z is None:
    qs = Model.objects.filter(x=x).filter(y=y)
...

如果要处理的参数太多,你可以使用类似这样的方式;假设 xyz 存储在一个字典 your values 中:

your_values = { 'x' : 'x value', 'y' : 'y value', 'z' : 'value'}
arguments = {}
for k, v in your_values.items():
    if v:
        arguments[k] = v

Model.objects.filter(**arguments)

撰写回答