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
答案 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)