【问题标题】:Q object parametersQ 对象参数
【发布时间】:2015-04-21 00:29:02
【问题描述】:
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/ 处的字段错误

无法将关键字“filter_obj”解析为字段。选择是: begin_time, 评论, created_at, created_by, created_by_id, end_time, id、leader、leader_id、name、project_task、status、ticket_project

【问题讨论】:

  • 你找到这些问题的答案了吗?

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


【解决方案1】:

如果您要组合未知数量的 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2020-10-18
    • 2017-09-16
    • 1970-01-01
    • 2015-04-13
    • 2016-06-23
    • 2013-05-30
    • 2015-03-14
    相关资源
    最近更新 更多