【问题标题】:How to retrieve all permissions of a specific model in django?如何在 django 中检索特定模型的所有权限?
【发布时间】:2016-11-18 09:43:46
【问题描述】:

默认情况下,每个 django 模型都有 3 个权限(添加、更改、删​​除)。在模型中,我可以定义我的自定义权限以添加更多内容。

class Company(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=64, unique=True)
    description = models.TextField(max_length=512)
    created_on = models.DateTimeField(auto_now_add=timezone.now)

    class Meta:
        permissions = (
            ("erp_view_company", "Can see the company information"),
            ("erp_edit_company", "Can edit the company information"),
            ("erp_delete_company", "Can delete the company"),
        )

迁移时,这些权限会在数据库级别自动创建。如何从模型中检索所有权限?

# retrieves the permissions
permissions = Permission.objects.filter(get_all_permissions_of_model_Company)
# adds permissions to group
group = Group.objects.create(name='foo', permissions=permissions)
# adds user to group
user.groups.add(group)

【问题讨论】:

标签: python django django-models permissions


【解决方案1】:

我建议你这样做:

all_permissions = Permission.objects.filter(content_type__app_label='app label', content_type__model='lower case model name')

检索模型的app_label:

Company._meta.app_label

检索模型的小写名称:

Company._meta.model_name

你也可以retrieve a ContentType instance representing a model:

ContentType.objects.get_for_model(Company)

由于ContentType 使用缓存,这是完全可以接受的。因此,还有另一种方法可以实现您的需求:

content_type = ContentType.objects.get_for_model(Company)
all_permissions = Permission.objects.filter(content_type=content_type)

【讨论】:

  • 你能帮我过滤模型的自定义权限吗
  • @SandeepPrasadKushwaha 我首先想到的是通过the codename field 过滤权限。如果这对您不起作用,请继续并为此发布一个单独的问题(以防它不存在)。
【解决方案2】:

您可以查看codename 字段,类似于:'change_company' 等...

model_name = 'company'
all_perms_on_this_modal = Permission.objects.filter(codename__contains=model_name)

【讨论】:

  • 我刚刚看到表权限有一个contentt_ype_id,它是表django_content_type中值的外键。与其使用代号,不如使用模型?
  • @realnot 我不会使用 contenttype,代号没有连接,所以更便宜
  • 这至少会在 2 种情况下失败:2 个模型在不同的应用程序中具有相同的名称,并且一个模型的权限包含另一个模型的名称。
  • @doniyor 我认为 ErnestTen 是对的。从查询中我得到: [,, 、,、、,,...这并不一定意味着模型设计不佳。
  • @realnot 好的,你是对的。那么你应该选择欧内斯特建议的解决方案。对不起欧内斯特,我在这里回答时没想到最后,你是绝对正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2021-11-29
  • 2018-05-07
  • 2021-11-20
  • 2011-05-03
  • 2019-11-02
相关资源
最近更新 更多