Python 如何在get方法中使用值列表?

Python 如何在get方法中使用值列表?,python,django,Python,Django,我在Django中有一个模板过滤器,看起来很难看,也不是很像Python。有没有办法将所有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 = Gro

我在Django中有一个模板过滤器,看起来很难看,也不是很像Python。有没有办法将所有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

这不起作用的原因是,user.groups.all()中的
组或group1或group2或group3被解析为
(组)或(group1)或(group2)或(group3在user.groups.all()中)
,因此它将评估
对象的真实性。通常,这些对象在默认情况下具有真实性
True
,因此该条件将始终成功

但是,我们不需要使用所有这些查询,我们可以使用单个查询来检查这一点。事实上:

@register.filter(name='is_supervisor')
def is_in_group(user):
    return Group.objects.filter(
        user=user,
        name__in=[
            'security supervisor',
            'cage supervisor',
            'casino supervisor',
            'food bev supervisor'
        ]
    ).exists()
@register.filter(name='is_supervisor')
def是_组中的_(用户):
返回组.objects.filter(
用户=用户,
姓名=[
“安全主管”,
“笼子管理员”,
“赌场主管”,
“食品bev主管”
]

).exists()
我认为
组名称列表必须存在,并且它将在函数之外(至少这样函数名称才有意义)。因此,您可以实现如下功能:

@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 = ['security supervisor', 'cage supervisor', 'casino supervisor', 'food bev supervisor']

编辑:多亏了@Willem Van Onsem,我们可以实现以下功能:

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

我认为这一定更有效。

不知何故,人们每天都在问这个问题,
x或y在z
,被解析为
(x)或(y在z)
,从而评估
组的真实性,这就是
True
。有时,在找到答案之前,我们不知道如何提问:)你介意将我链接到一些类似的帖子吗?第一个过滤器确实有效(我通过将导致
True
的变量移动到不同的组中进行测试),尽管它看起来很难看。你贴的那个更像是蟒蛇,这正是我想要的。我正在努力学习以最好的方式编写。当你说“所有那些查询”和“一个查询”时,你是说我的代码对数据库进行了4次单独的调用,而你的代码只进行了一次调用?@DavidAlford:没错。到数据库的“往返”次数减少到一次。对于像我这样的新手来说,这段代码更容易阅读。伟大的编辑!我很高兴这有帮助:)