【问题标题】:Django join query for permissions and group?Django加入查询权限和组?
【发布时间】:2016-06-08 09:19:08
【问题描述】:

我想以某种方式加入一个拥有我所有权限的组。 我想查询所有权限,并为每个权限查询一个布尔指示符,如果该组有它。 所以假设这个

group = Group.objects.get(pk=1) # specific group  

Permission.objects.all().annotate(群里有吗??)

group.permissions.all()

因为我想查询所有权限,所以无济于事。

更新: 清晰的解释:
假设我的权限表是(pk 值):1、2、3 - 总共三行。
组表:一组,pk=1。
组权限(多对多)表:分组为 pk 1,权限为 1,2(所以两行)

我想显示所有权限,并在它们附近显示该组是否拥有它。 所以在我们的例子中,我应该得到:
1 对
2 真
3 错误

因为该组没有 pk=3 的权限。

【问题讨论】:

    标签: django join permissions many-to-many


    【解决方案1】:

    我认为下面的查询对你有用

    from django.db.models import Case, When, BooleanField
    
    group_name = 'your group name'
    Permission.objects.annotate(
        has_perm=Max(Case(
            When(group__name=group_name, then=1),
            default=0,
            output_field=BooleanField()
        ))
    ).values_list('name', 'has_perm').order_by('has_perm')
    

    Conditional expressions 是在 Django 1.8 中引入的,aggregation (annotate) 也有据可查。

    【讨论】:

    • 忘了说这确实有效。只是一个问题——Max 需要什么?
    • 因为没有最大值,我得到重复的结果.. 我不明白为什么
    • annotate 导致group by,在这种情况下,基于Permission.pk(如果之前有values() 调用,它将group by 那些列)。调试复杂查询时,查看生成的 SQL 会很有帮助,例如:print Permission.objects.annotate(...).query
    猜你喜欢
    • 2018-10-29
    • 2019-12-18
    • 2016-07-10
    • 2015-08-15
    • 2013-05-04
    • 2022-01-23
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多