Пользовательская пользовательская модель 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
Мне пришлось:
- удалить базу данных
- создать новую базу данных
- удалить все миграции из всех моделей
- сделать миграции заново
- мигрировать
Это было двойное раздражение, потому что я должен был сделать это на локальном и удаленном сервере. Я попытался просто удалить миграции или удалить базу данных, но тогда git выдвинул/запустил старые миграции и все испортил.
PS Эта ошибка изначально возникла из-за того, что я запустил миграцию перед добавлением AUTH_USER_MODEL = 'customauth.MyUser'
в файл settings.py
, который не контролируется версией.