Bri*_*n D 12 python mysql django django-models
我想做一个查询,比如
Model.objects.filter(x=x).filter(y=y).filter(z=z)
Run Code Online (Sandbox Code Playgroud)
...但在某些情况下,例如y为None.这在字面上搜索数据库中的y列中的空值 - 如果它是none,有没有一种基本上忽略该查询参数的方法,即返回查询集
Model.objects.filter(x=x).filter(z=z)?
Run Code Online (Sandbox Code Playgroud)
jaz*_*azz 15
我不知道,如果我得到你的问题,但是
Model.objects.filter(x=x, y__isnull = False, z=z)
Run Code Online (Sandbox Code Playgroud)
为您提供查询集,其中列为y非null(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)
...
Run Code Online (Sandbox Code Playgroud)
如果有太多的论据要处理,你可以使用这样的东西; 假设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)
Run Code Online (Sandbox Code Playgroud)
这样的事情可以工作:
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)
Run Code Online (Sandbox Code Playgroud)
因为QuerySets 是惰性的,所以这不涉及任何数据库活动。