Django:如何为权限创建ContentType对象?

时间:2019-05-05 19:29:38

标签: django

我正在尝试在后端创建组和权限。

现在,我试图了解什么是content_type参数以及在创建权限时如何使用它。

Documentation for Permission model says

  

content_type¶

     

必需的。 django_content_type数据库表的引用,其中包含每个已安装模型的记录。

如何获取此content_type?我应该在哪里寻找?

我正在使用PosgresSQL作为数据库。

根据this other question,可以做到这一点:

from django.contrib.auth.models import User, Group, Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get(app_label='app_name', model='model_name')
permission = Permission.objects.create(codename='can_create_hr',
                                       name='Can create HR',
                                       content_type=content_type) # creating permissions
group = Group.objects.get(name='HR')
group.permissions.add(permission)

不过,app_label='app_name', model='model_name'里面是什么:
content_type = ContentType.objects.get(app_label='app_name', model='model_name')

我的项目结构:

stickers-gallito-app
    |_cart
    |_shop

1 个答案:

答案 0 :(得分:1)

我们在source code [GitHub]中看到它是指ContentType model [Django-doc]

class Permission(models.Model):

    #  ...

    name = models.CharField(_('name'), max_length=255)
    content_type = models.ForeignKey(
        ContentType,
        models.CASCADE,
        verbose_name=_('content type'),
    )
    codename = models.CharField(_('codename'), max_length=100)

ContentType是一个引用模型类的模型。如果您安装contentype应用程序,则Django将维护该表并“维护”该表:这意味着,如果您添加一个额外的模型,则Django将自动向ContentType模型中添加一个条目。您可以在数据库中(通常在django_content_type表下)看到这些值。

app中定义了一个模型类,并且该应用程序带有标签。此外,模型本身也具有名称。例如,对于User模型,我们看到:

>>> from django.contrib.auth.models import User
>>> User._meta.app_label
'auth'
>>> User._meta.model_name
'user'

因此可以通过app_labelmodel_name指定模型。

例如,您可以通过model_class method获得对该内容类型的类的引用:

mypermission.content_type.model_class()