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. Затем появится запрос на имя пользователя, электронную почту и пароль, так что введите свои учетные данные, и все снова будет работать правильно. Надеюсь, это будет полезно.

Вернуться на верх