2013-09-21 106 views
0

我構建過濾器作爲列表,但無法使用Q函數構建它們。這似乎是做事手動過濾器的工作,但試圖建立的連接字符串,我得到以下問題的過濾器時:在Django中構建自定義查詢過濾器列表

下面是該查詢:

MyLocationFilter = BuildQueryORFilter('MyLocationCountryCode', MyLocationCodePref1) 
list = AboutMe.objects.order_by('MyLinkedInLastName').filter(reduce(OR, MyLocationFilter)) 

這裏是怎麼了建立這些過濾器:

def BuildQueryORFilter(fieldname, fieldvalues): 
    QueryList = [] 
    spltfieldvalues = fieldvalues.split() 
    for item in spltfieldvalues: 
     strpitem = item.strip('[],') 
     queryitem = Q(fieldname+"__contains="+strpitem) 
     QueryList.append(queryitem) 
    return QueryList 

但是這個問題似乎是如何獲得的Q(fieldname__contains=gb)形式Q(..)而不是Q('fieldname__contains=gb')這似乎是嘔吐的問題,如:

ValueError 
Exception Value:  
need more than 1 value to unpack 

我該如何構建Q查詢以避免這種拆箱問題?

回溯爲可能的答案(下面)

Traceback: 
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/brett/LinkedIn/phaseone/jelt/views.py" in AboutMeList 
    259. list = AboutMe.objects.order_by('MyLinkedInLastName').filter(MyLocationFilter) 
File "/usr/lib/python2.7/dist-packages/django/db/models/query.py" in filter 
    624.   return self._filter_or_exclude(False, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/django/db/models/query.py" in _filter_or_exclude 
    642.    clone.query.add_q(Q(*args, **kwargs)) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in add_q 
    1250.        can_reuse=used_aliases, force_having=force_having) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in add_filter 
    1056.   arg, value = filter_expr 

Exception Type: ValueError at /list/ 
Exception Value: need more than 1 value to unpack 

回答

2

由拆包一個字典傳遞關鍵字參數。

strpitem = item.strip('[],') 
    key = fieldname + "__contains" 
    d = {key: strpitem} 
    queryitem = Q(**d) 
+0

我綁這一點,但打印出來queryitem篩選時,我得到:(AND(「MyLocationCountryCode__contains」,u'gb')),並試圖篩選時,我仍然得到同樣的問題。 – disruptive

+0

你可以更新你的答案,包括完整的追溯? – Alasdair

+0

添加了追蹤 – disruptive