2013-09-21 44 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