Как использовать список значений в методе get? - PullRequest
2 голосов
/ 18 октября 2019

У меня есть шаблонный фильтр в Django, который выглядит некрасиво и не очень питонно. Есть ли способ объединить все запросы get в список?

@register.filter(name='is_supervisor')
def is_in_group(user):
    group = Group.objects.get(name="security supervisor")
    group1 = Group.objects.get(name="cage supervisor")
    group2 = Group.objects.get(name="casino supervisor")
    group3 = Group.objects.get(name="food bev supervisor")
    return True if group or group1 or group2 or group3 in user.groups.all() else False

Я пытался использовать фильтр Q для их объединения, но это не сработало. Я также попробовал:

@register.filter(name='is_supervisor')
def is_in_group(user):
    types = ["security supervisor", "cage supervisor",
             "casino supervisor", "food bev supervisor"]
    for name in types:
        test1 = Group.objects.get(name=name)
    return True if test1 in user.groups.all() else False

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Я считаю, что group_names_list должно существовать, и оно будет за пределами функции (по крайней мере, так имя функции имеет смысл). Таким образом, вы можете реализовать эту функцию следующим образом:

@register.filter(name='is_supervisor')
def is_in_groups(user, group_names_list):
    result = False
    for group_name in group_names_list:
        result = result or Group.objects.get(name=group_name) in user.groups.all()
    return result

и передать group_names_list в функцию:

group_names_list = ['security supervisor', 'cage supervisor', 'casino supervisor', 'food bev supervisor']

РЕДАКТИРОВАТЬ: Благодаря@ Виллем Ван Онсем, мы можем реализовать эту функцию следующим образом:

@register.filter(name='is_supervisor')
def is_in_groups(user, group_names_list):
    return Group.objects.filter(user=user, name__in=group_names_list)

Что, я думаю, должно быть более эффективным.

2 голосов
/ 18 октября 2019

Причина, по которой это не работает, заключается в том, что ваш group or group1 or group2 or group3 in user.groups.all() анализируется как (group) or (group1) or (group2) or (group3 in user.groups.all()), и, таким образом, он будет оценивать достоверность объекта group. Обычно эти объекты имеют по умолчанию истинность True, и поэтому условие всегда будет выполнено.

Однако нам не нужно использовать все эти запросы, мы можем проверить это с помощью одного запроса. Действительно:

@register.filter(name='is_supervisor')
def is_in_group(user):
    return Group.objects.filter(
        <b>user=user</b>,
        <b>name__in</b>=[
            'security supervisor',
            'cage supervisor',
            'casino supervisor',
            'food bev supervisor'
        ]
    ).exists()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...