Q对象参数

时间:2015-02-19 15:25:40

标签: django django-models django-views django-q

from django.db.models import Q

MODULES_USERS_PERMS = {
    MODULE_METHOD: [],
    MODULE_NEWS: [],
    MODULE_PROJECT: ['created_by', 'leader'],
    MODULE_TASK: [],
    MODULE_TICKET: [],
    MODULE_TODO: []
}
filter_fields = MODULES_USERS_PERMS[MODULE_PROJECT]
perm_q = map(lambda x: Q(x=user), filter_fields)
if perm_q:  #sum(perm_q)
    if len(perm_q) == 1:
        return perm_q[0]
    elif len(perm_q) == 2:
        return perm_q[0] | perm_q[1]
    elif len(perm_q) == 3:
        return perm_q[0] | perm_q[1] | perm_q[2]

我不知道如何用文字描述代码所需要的内容,我希望他能为自己说话。 我需要从对象列表中创建一个过滤器。

无用的代码无效。

更新: 代码,看起来更好,但也不行:

filters = ['created_by', 'leader']
filter_params = Q()
for filter_obj in filters:
    filter_params = filter_params | Q(filter_obj=user)
  

/ projects /

中的FieldError      

无法解析关键字' filter_obj'进入田野。选择是:   begin_time,comment,created_at,created_by,created_by_id,end_time,   id,leader,leader_id,name,project_task,status,ticket_project

1 个答案:

答案 0 :(得分:3)

如果您希望合并未知数量的Q个对象:

import operator
perm_q = reduce(operator.or_, perm_q)

或者:

summed_q = perm_q[0]
for new_term in perm_q[1:]:
    summed_q = summed_q | new_term

同样的事情也是如此,只是更明确。

根据您的编辑 - 您需要将filter_obj变量中包含的字符串转换为关键字参数。您可以通过创建一个字典作为Q构造函数的关键字参数来执行此操作:

filters = ['created_by', 'leader']
filter_params = Q()
for filter_obj in filters:
    kwargs = {filter_obj: user}
    filter_params = filter_params | Q(**kwargs)