Py学习  »  问与答

[精华] 求助:多条件查询。

aga0217 • 9 年前 • 14643 次点击  

小弟做了一个综合查询的表单,想根据各种条件组合进行查询,具体如下: 条件一;条件二;条件三;条件四;条件五。(五个条件没有从属关系,可以任意组合也可以一个都不选,且都是同一model的字段。) 上面的条件使用下拉列表做了限制,现在问题来了:如果使用model.objects.filter(var1=条件一,var2=条件二,......),这样进行查询的话,如果碰到没有选择的条件如何处理?有没有这样的处理方式:将没有选择的条件视为‘none’或者‘null’,最后自动将被选择的条件直接生成查询语句?在网上搜索到了关于“动态查询”的相关信息,也找到了一些解决方法,但是感觉都与我这个问题不一样,都是将字段与变量作为参数进行传递然后查询,这样的话我需要将5种条件若干种组合分别写出参数。感觉有更好的方法来解决,特来求助,希望各位给予帮助给出解决方法或思路,谢谢!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/828
 
14643 次点击  
文章 [ 9 ]  |  最新文章 9 年前
aga0217
Reply   •   1 楼
aga0217    9 年前

@走遍北京的德福小猪-weibo 高啊,谢谢了,正在犯愁如何提高代码的重复利用率呢。谢了!

走遍北京的德福小猪-weibo
Reply   •   2 楼
走遍北京的德福小猪-weibo    9 年前

再进一步分析: 可以把这个查询进行封装:

# 获取动态过滤调价
def getKwargs(data={}):
     kwargs = {}
     kwargs['state'] = True 
     for (k , v)  in data.items() :
        if v is not None and v != u'' :
                 kwargs[k] = v          
        return kwargs

然后使用的时候:

searchCondition = {'name__icontains' : name ,....}
kwargs = utils.getKwargs(searchCondition)
model_set = Model.objects.filter(**kwargs)
易冷天涯
Reply   •   3 楼
易冷天涯    9 年前

@aga0217 支持,我一直用这种方法写条件数≥3的查询。

Py站长
Reply   •   4 楼
Py站长    9 年前

@aga0217 嗯,不错

olivetree
Reply   •   5 楼
olivetree    9 年前

@aga0217 学习了

aga0217
Reply   •   6 楼
aga0217    9 年前

@olivetree @Django中国社区 估计是我没有表述清楚,二位的方法并不适合我的情况,后来在这篇违章中http://www.yihaomen.com/article/python/218.htm找到了方法如下:

kwargs = {}
if var1 != 'NONE':
   kwargs['field1'] = var1
if var2 is not None:
   kwargs['field2'] = var2
if var3 is not None:
   kwargs['field3'] = var3
if var4 is not None:
   kwargs['field4'] = var4
quest = model.objects.filter(**kwargs)

这样的话只要表单做出了选择,就会将相应的字段和值传入查询语句,没有选择的扎表单字段为None,不会影响查询。 感谢二位的帮助,谢谢!

Py站长
Reply   •   7 楼
Py站长    9 年前
data = model.objects.filter(条件1)
if a==4:
    data = data.fiter(条件2)
if b==4:
    data = data.filter(条件3)
aga0217
Reply   •   8 楼
aga0217    9 年前

@olivetree 是这样的,这正个条件都是以下拉列表的形式列出来的,我一开始也按照你的方法写的,判断下拉列表的选择状态,然后进行查询,但是如果当一个条件没有选择的情况下如何处理呢?我尝试将没有选择的条件对应的字段值变为设为None或者NULL,但是都不会再得到查询结果。比如model.objects.filter(var2=条件二).filter(var3=条件三).filter(var4=条件四),一次查询可以像上面这样写但是下次查询的时候也许并没有选择条件四,我就只能再重写一个没有条件四的查询,以此类推,5个条件都有选择或不选择的状态,这样就需要写若干语句。我来求助的就是想找一个通用的发放,能使用一个方法来处理这样的情况。谢谢你的回复。

olivetree
Reply   •   9 楼
olivetree    9 年前

不需要写组合啊,你可以model.objects.filter(var1=条件一).filter(var2=条件二).filter(var3=条件三),每个参数对应一个条件,有参数就加一个filter(),没有就不加