OperationalError at / нет такой таблицы: users_user
У меня была модель Profile, которая была расширением моей модели User, которая была ForeignKey моей модели Post, но я изменил ее на AbstractUser и теперь, если я пытаюсь мигрировать или запустить и обновить страницу на сервере, я получаю ошибку.
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
bio = models.TextField(max_length=500,null=True)
from django.db import models
from django.conf import settings
from django.urls import reverse
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=100)
content = models.TextField()
def get_absolute_url(self):
return reverse('post-details', kwargs={'pk': self.pk})
settings.py
INSTALLED_APPS = [
...
'posts',
'users',
]
AUTH_USER_MODEL = 'users.User'
сообщение об ошибке после попытки миграции
Apply all migrations: admin, auth, contenttypes, posts, sessions, users
Traceback (most recent call last):
File "/home/user/Projects/DNF/Project/manage.py", line 22, in <module>
main()
File "/home/user/Projects/DNF/Project/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.10/dist-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/base.py", line 402, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/base.py", line 448, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/base.py", line 96, in wrapped
res = handle_func(*args, **kwargs)
File "/usr/local/lib/python3.10/dist-packages/django/core/management/commands/migrate.py", line 295, in handle
pre_migrate_apps = pre_migrate_state.apps
File "/usr/local/lib/python3.10/dist-packages/django/utils/functional.py", line 57, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/state.py", line 566, in apps
return StateApps(self.real_apps, self.models)
File "/usr/local/lib/python3.10/dist-packages/django/db/migrations/state.py", line 637, in __init__
raise ValueError("\n".join(error.msg for error in errors))
ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'users.user', but app 'users' doesn't provide model 'user'.
The field posts.Post.author was declared with a lazy reference to 'users.user', but app 'users' doesn't provide model 'user'.
The field users.Profile.user was declared with a lazy reference to 'users.user', but app 'users' doesn't provide model 'user'.
попробуйте напрямую обратиться к модели User, а не через настройки
измените поле внешнего ключа на следующее:
author = models.ForeignKey("users.User", on_delete=models.CASCADE, null=True)
Чтобы иметь ссылку на модель User, не следует делать это напрямую через настройки, вместо этого можно использовать функцию get_user_model()
. Эта функция вернет текущую активную модель пользователя проекта (пользовательскую модель пользователя, если она указана, или User в противном случае).
Измените поле внешнего ключа вашей Post
модели следующим образом:
from django.db import models
from django.conf import settings
from django.urls import reverse
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
...
Reference: get_user_model()
[Django-doc]
Я легко решил эту проблему, удалив все файлы миграции в папке migrations, кроме файла init.py. А также удалением db.sqlite3. Теперь выполните следующие команды: python manage.py makemigrations и затем python manage.py migrate. Теперь вам снова нужно создать суперпользователя, для этого просто введите следующую команду: python manage.py createsuperuser. Затем появится запрос на имя пользователя, электронную почту и пароль, так что введите свои учетные данные, и все снова будет работать правильно. Надеюсь, это будет полезно.