在 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)
迁移后添加权限
我正在尝试向 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)
迁移后添加权限