在 Django 中为用户模型添加权限

Adding permission to User model in Django

我正在尝试向 Django 中的用户模型添加权限 'view_user'。我添加了一个代理模型:

from django.contrib.auth.models import User, Permission
from django.db import models


class RodanUser(User):
    class Meta:
        proxy = True
        permissions = (
            ('view_user', 'View User'),
        )

但我收到错误:

ContentType matching query does not exist.

我认为这是因为 Django 用户的 app_label 是 auth 而 RodanUser 的 app_label 是 rodan 所以我更改了模型并添加了 app_label:

from django.contrib.auth.models import User, Permission


class RodanUser(User):
    class Meta:
        proxy = True
        permissions = (
            ('view_rodanuser', 'View User'),
        )
        app_label = 'auth'

现在我得到错误:

MixedContentTypeError at /users/

最奇怪的是,我实际上能够通过首先添加一个 none-代理模型来实现它:

from django.contrib.auth.models import User, Permission
from django.db import models


class RodanUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta:
        permissions = (
            ('view_rodanuser', 'View Rodan User'),
        )

然后从上面将其更改为代理模型(没有 app_label)因为 none-代理模型将在 content_type_id 指向 RodanUser 的数据库中添加权限而不是用户。

我发现 this 这解释了为什么我不能使用经过许可的代理。还有其他建议吗?

我用另一种方法解决了这个问题: 在我的项目的 __init__.py 中,我添加了:

@receiver(post_migrate)
def add_user_view_permissions(sender, **kwargs):
    content_type = ContentType.objects.get(app_label='auth', model='user')
    Permission.objects.get_or_create(codename='view_user', name='View User', content_type=content_type)

迁移后添加权限