AUTH_USER_MODEL относится к модели '% s', которая не была установлена ​​"

Я использую CustomUser в своей модели. Это диспетчер пользователей.

class UserManager(BaseUserManager):

    def create_user(self, email, username, password=None, is_staff=False, is_superuser=False, is_active=False,
                    is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True):
        logger = logging.getLogger(__name__)
        logger.info("REGULAR user created!")
        if not email:
            raise ValueError('Email is required')
        if not username:
            raise ValueError('Username is required.')
        email = self.normalize_email(email)
        user = self.model(email=email, username=username, is_staff=is_staff, is_superuser=is_superuser,
                          is_active=is_active, is_bot=is_bot, is_mobile_verified=is_mobile_verified,
                          is_online=is_online, is_logged_in=is_logged_in)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        logger = logging.getLogger(__name__)
        logger.info("SUPER user created!")
        return self.create_user(email, username, password=password, is_staff=True, is_superuser=True, is_active=True,
                                is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True)

Это мое определение пользовательской модели пользователя.

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=False, unique=True, max_length=255)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    birthday = models.DateField(null=True)
    gender = models.CharField(max_length=255, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_mobile_verified = models.BooleanField(default=False)
    is_online = models.BooleanField(default=False)
    is_logged_in = models.BooleanField(default=True)
    is_bot = models.BooleanField(default=False)
    location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    #objects = UserManager()

    get_user_model().objects.create_user(...)

Если я раскомментирую строку objects = UserManager(), я могу запустить сервер, но суперпользователи, созданные из бэкэнда администратора, не смогут войти в систему. Если я использую get_user_model(), код ломается, и я получаю следующую ошибку

 "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'bouncer.User' that has not been installed

Но в моем settings.py я определил модель пользователя auth

AUTH_USER_MODEL = 'bouncer.User'

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

Что я здесь делаю не так?

вам удалось заставить это работать? после обновления до 2.1.4 с 2.0.6 я получаю эту ошибку, и мои настройки идентичны вашим.

Ray 16.01.2019 21:22

@Ray нет, я не мог. Я вручную переместил проект .... представьте!

Melissa Stewart 18.01.2019 19:04

Не могли бы вы опубликовать свой INSTALLED_APPS из settings.py? Возможно, произошел сбой при импорте или необходимо изменить порядок импорта.

Jacob 21.11.2019 17:07

Вы вызываете get_user_model().objects.create_user(...) в рамках своей пользовательской модели ??

Jacob 21.11.2019 17:09

Я неправильно понимаю: почему вы вызываете create_user в определении вашего класса User?

RishiG 22.11.2019 00:59

У меня было это сообщение об ошибке при попытке выполнить «миграцию» для AUTH_USER_MODEL. Причина в том, что внутри того же приложения с AUTH_USER_MODEL была вторая модель с использованием get_user_model (). Необходимо было закомментировать вторую модель и произвести «миграцию» в два этапа.

mirek 01.04.2020 11:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
6
12 418
9

Ответы 9

Эта ошибка выглядит так, будто bouncer отсутствует в вашем INSTALLED_APPS.

Итак, чтобы уточнить, вы должны иметь

  • bouncer/models.py, содержащий модель User (или models/__init__.py, который импортирует модель из другого файла)
  • 'bouncer' в списке INSTALLED_APPS в настройках
  • AUTH_USER_MODEL = 'bouncer.User' (как и у вас).

Да, вышибала есть в списке установленных приложений.

Melissa Stewart 15.07.2018 17:53

находится ли bouncer перед вашим приложением в списке установленных приложений? Из вопроса не совсем очевидно, когда вы на самом деле вызываете get_user_model, но если это происходит, когда django загружает ваше приложение, сначала нужно будет загрузить bouncer.

RishiG 22.11.2019 01:01

попробуйте импортировать from django.db import models, только после, импортируя from django.contrib.auth.models import AbstractUser

Убедитесь, что вы зарегистрировали свою модель в admin.py, а не в models.py

# admin.py
from django.contrib.auth.admin import UserAdmin

admin.site.register(YourUser, UserAdmin)

Это решило проблему для меня.

Проблема также может возникнуть из-за ограничения прав доступа к файлам. Убедитесь, что папке "bouncer" предоставлены необходимые разрешения.

Для всех, кто читает это в 2020 году, я подозреваю, что проблема связана с зависимостью. Я столкнулся с той же ошибкой, что и OP.

Ваши первые две проверки должны быть:

1 - Находится ли приложение в списке installed apps в вашем settings.py?

2 - Установлен ли AUTH_USER_MODEL = "app_name_from_apps_py.model_name" в settings.py?

Это касается большинства других ответов, которые я прочитал.

Чего я не понял, читая документацию, так это того, что для использования get_user_model() вам нужно сначала установить свою модель. Конечно да ?!

Итак, выше, где OP использует get_user_model(), они создают циклическую зависимость. Вы не можете использовать get_user_model() в классе, который создает эту модель.

Попробуйте изменить положение приложения-вышибалы на вашем INSTALLED APPS, у меня это сработало.

В моем случае я случайно вставил в класс Meta моего настраиваемого пользователя атрибут abstract = True. Таким образом возникает эта ошибка.

Никогда не помещайте настраиваемую модель пользователя и дополнительные модели, содержащие ссылки на модель пользователя, в один файл models.py в одном приложении. Это может быть связано с той ошибкой.

Плохая идея, приводящая к этой ошибке:

# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
from django.conf import settings

class User(AbstractUser):
    pass

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    some_field = models.CharField(max_length=25)

Это хорошая идея:

# customUserModel/models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

# additionalUserProfile/models.py
from django.conf import settings
class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    some_field = models.CharField(max_length=25)

#settings.py
AUTH_USER_MODEL = 'customUserModel.User'

Для меня это было потому, что у меня был myapp/models/__init__.py, и я попытался поместить определение пользовательской модели User в myapp/models/user.py и установить AUTH_USER_MODEL = myapp.User. Перенос пользовательского определения модели User в myapp/models/__init__.py исправил это. Мне не удалось импортировать его в __init__.py; Мне пришлось перенести определение туда.

Другие вопросы по теме