Django中的多匹配查詢
**check_list
1. 問題
我們在前端可能有多個下拉框之類的查詢條件
但
- 下拉框的條件並不一定全選check_list
- 下拉框的數量可能很多
- 配合別的條件進行查詢時
- 等等
遇到這些查詢我們能直接寫查詢語句嗎?可以,但要將每一種情況都考慮到並且不斷判斷過於複雜繁瑣。
2. 思考過程
在遇到這個問題時,我在思考:
- 對傳過來的條件進行判斷
- 將有效的查詢條件放進字典
但如何從字典中取出查詢條件加入filter語句呢?如果查詢時遇到類似雙下劃線查詢或者多表查詢怎麼辦?
3. 解決過程
在遇到我們自己不能解決的問題,最通常的辦法可能就是百度了。
是的,我取百度了,結果讓我很驚喜,確實有相關方法
# 獲取動態過濾調價
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)
看到這裏是不是很驚喜,多簡單啊,這就完了
呵呵,事實告訴我高興的太早了!
爲什麼呢,找不到utils從哪導入的啊,這就相當於買好電影票卻找不到電影院了,極其難受。半天百度無果後,果斷放棄。
但這不是無用功
最起碼讓我肯定了字典的方式可以進行filter過濾查詢
需要注意的是:要將字典的key設爲在filter中的key,值爲匹配的值
最後是一個驚喜的環節,無意中拿**check_dict
試了一下,成功了!!!
所以結果就是filter可以用字典參數來作爲查詢條件
4. 最終結果
"""字典示例
check_list爲最終的字典
"""
check_dict = {}
"""雙下劃線查詢
"""
check_dict["education__lte"] = 值
check_dict["time__gte"] = 值
check_dict["pay__in"] = 值
check_dict["job_skill__icontains"] = 值
"""多表查詢
"""
check_dict["j_company__c_staff"] = 值
"""查詢語句
"""
job_obj = Model.objects.filter(**check_dict).all()