参数为none django时查询

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)


rol*_*one 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)
Run Code Online (Sandbox Code Playgroud)

因为QuerySets 是惰性的,所以这不涉及任何数据库活动。