Пользовательская пользовательская модель Django в admin, отношение "auth_user" не существует

У меня есть пользовательская модель, как показано ниже:

class User(AbstractUser):
    subscribe_newsletters = models.BooleanField(default=True)
    old_id = models.IntegerField(null=True, blank=True)
    old_source = models.CharField(max_length=25, null=True, blank=True)

И используя встроенный UserAdmin

admin.site.register(User, UserAdmin)

При редактировании записи пользователя работает нормально, но когда я добавляю пользователя, я получаю следующую ошибку

Exception Value: 
relation "auth_user" does not exist
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...

Ответ 1

После некоторого копания я нашел это

https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

Преступник является функцией clean_username внутри UserCreationForm внутри django.contrib.auth.forms.py. Несколько билетов были созданы, но, судя по всему, сопровождающие не считают это дефектом:

https://code.djangoproject.com/ticket/20188

https://code.djangoproject.com/ticket/20086

def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

User в этом файле напрямую ссылается на встроенную пользовательскую модель.

Чтобы исправить это, я создал свои собственные формы

from models import User #you can use get_user_model
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import forms

class MyUserCreationForm(UserCreationForm):
    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

    class Meta(UserCreationForm.Meta):
        model = User

class MyUserAdmin(UserAdmin):  
    add_form = MyUserCreationForm   

admin.site.register(User,MyUserAdmin)

Или вы можете попробовать обезглавить исправление оригинала UserCreationForm, чтобы заменить переменную User.

Ответ 2

Это связано с тем, что миграция не выполняется. Эта проблема решена для меня, выполнив следующую команду:

python manage.py syncdb

Ответ 3

Django 1.8

Если ваше приложение еще не использует миграции, это также может быть проблемой, так как contrib.auth использует их. Включение миграции для моего приложения разрешило это для меня.

$ ./manage.py makemigrations <my_app>
$ ./manage.py migrate

Ответ 4

Сначала перенесите свое приложение (одно с пользовательской моделью пользователя), а затем остальное:

$ ./manage.py makemigrations <your_app>
$ ./manage.py migrate
$ ./manage.py makemigrations
$ ./manage.py migrate

Вы также можете контролировать порядок миграции, чтобы убедиться, что это происходит автоматически, см. https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#controlling-the-order-of-migrations

Ответ 5

Мне пришлось:

  1. удалить базу данных
  2. создать новую базу данных
  3. удалить все миграции из всех моделей
  4. сделать миграции заново
  5. мигрировать

Это было двойное раздражение, потому что я должен был сделать это на локальном и удаленном сервере. Я попытался просто удалить миграции или удалить базу данных, но тогда git выдвинул/запустил старые миграции и все испортил.

PS Эта ошибка изначально возникла из-за того, что я запустил миграцию перед добавлением AUTH_USER_MODEL = 'customauth.MyUser' в файл settings.py, который не контролируется версией.