Добавление разрешения на модель пользователя в Django

Я пытаюсь добавить разрешение «view_user» для модели пользователя в Django. Я добавил прокси-модель:

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.

что, на мой взгляд, связано с тем, что app_label пользователя Django — auth, а app_label RodanUser — 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), потому что модель без прокси добавит разрешение в БД, где content_type_id указывает на RodanUser вместо пользователя.

Я нашел это, что объясняет, почему я не могу использовать прокси с разрешения. Любые другие предложения?


person Nicky Mirfallah    schedule 15.08.2016    source источник


Ответы (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)

Что добавляет разрешение после миграции.

person Nicky Mirfallah    schedule 15.08.2016
comment
это __init__.py приложения django (тот, который имеет то же имя, что и проект django) или сам проект django? - person Gobi Dasu; 03.01.2017