在Django中构建自定义查询过滤器列表

时间:2013-09-21 15:22:03

标签: sql django

我正在构建我的过滤器作为列表但是在使用Q函数构建它们时遇到了麻烦。似乎手动操作过滤器可以工作,但是当尝试通过连接字符串来构建过滤器时,我会遇到以下问题:

以下是查询:

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('fieldname__contains=gb')的形式获得Q(..),这似乎引发了诸如以下问题:

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

1 个答案:

答案 0 :(得分:2)

通过解压缩dict来传递关键字参数。

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