3

我正在尝试向 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 的 User 的 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/

最奇怪的是,我实际上能够通过首先添加一个非代理模型来使其工作:

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),因为非代理模型将在 DB 中添加权限,其中 content_type_id 指向 RodanUser 而不是 User。

我发现解释了为什么我不能在获得许可的情况下使用代理。还有其他建议吗?

4

1 回答 1

1

我通过使用另一种方法解决了这个问题:在__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)

迁移后添加权限。

于 2016-08-15T20:03:52.060 回答