1
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

4

1 に答える 1

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)
于 2015-02-19T17:15:07.607 に答える