参数为空时的Django查询
我想做一个查询,类似于
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)
...
如果要处理的参数太多,你可以使用类似这样的方式;假设 x
、y
、z
存储在一个字典 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)