Как исправить ошибки для Auth/CustomUser в Django после сброса миграций и db?
After experimenting with setting up CustomUser and many-to-many relationships, I decided to make some (what turned out to be major) changes to the models. I had read that CustomUser/Auth needs to be set up first, or else it'll be a mess. But since I'm just learning and there was barely any data involved, I just went for it--not to mess up the CustomUser model intentionally, but I changed a model name--and (maybe this is the critical error) I updated the names everywhere it appeared. Now I'd deleted and reset the database, VENV folder, all the migration (along with __pycache__) files, and recreated test data so many times that I thought I could download the GitHub repo and set up a fresh new app easily again. But the app refuses to run and keeps asking for a missing table.
Создание приложения не является моей главной задачей - я хотел бы понять, что произошло - что это за недостающая таблица (см. фрагмент кода ошибки)? И: Почему в совершенно исправном репозитории возникла та же проблема с отсутствующей таблицей?
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/Volumes/Volume2/dev/lms6-v2/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
File "/Volumes/Volume2/dev/lms6-v2/venv/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 477, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: accounts_staff
Приложение называется accounts, а модели CustomUser следующие:
class CustomUser(AbstractUser):
user_type_data = ((1, "HOD"), (2, "Staff"), (3, "Student"))
user_type = models.PositiveSmallIntegerField(default=1, choices=user_type_data)
email = models.EmailField(_('email address'), unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
class AdminHOD(models.Model):
id = models.AutoField(primary_key=True)
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
class Staff(models.Model):
id = models.AutoField(primary_key=True)
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
user_type = "Staff"
email = models.EmailField()
address = models.TextField(blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
note = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
def __str__(self):
return self.admin.first_name + " " + self.admin.last_name
def get_absolute_url(self):
return reverse('staff_detail', kwargs={'pk': self.pk})
Прежде всего, вам нужно удалить все файлы миграций (если они у вас есть) и (pycache) ...
После того, как вы это сделали, не запускайте просто makemigration, вы должны быть логичны с этим
- запустите python manage.py makemigrations <имя_приложения:приложение, содержащее AUTH_USER_MODEL> .
- запустите python manage.py makemigrations <app_name>, но на этот раз вы решаете, какое приложение будет следующим в том порядке, в котором вы написали свои модели, они делают makemigrations в этом порядке". 3)запустите python manage.py makemigrations 4)наконец, запустите python manage.py migrations .
... вот как я решаю эту проблему каждый раз, когда сталкиваюсь с ней
Очевидно, что возиться с моделью CustomUser в Django не стоит, но это был хороший обучающий опыт. Так что для новичков, случайно застрявших на одном месте, ответ Ogechuwku Matthew будет хорошим началом.
Подробнее - вот что я сделал:
- Удалите все файлы миграции, включая файлы в
__pycache__(ИСКЛЮЧАЯ файл(ы)__init__). - Отключите строку
AUTH_USER_MODEL = 'myapp.MyCustomUser'вsettings.pyЭтот шаг является ключевым. - Удалите (или закомментируйте) все файлы, кроме самых необходимых.
- Закомментировал все, кроме
CustomUserмодели и моделей, расширенных из нее. - Выполнил
python manage.py makemigrations <app_name>и затем 'python manage.py migrate' .
- После того, как шаг 4 сработал, выполнил
python manage.py makemigrations <app_name>иpython manage.py migrateснова. - Переместил остальные файлы обратно, начиная с самых простых, таких как "HomeView" в
views.pyи "home.html". - Когда приложение запустилось с 'home.html', удалите комментированные модели, представления и url по одному кластеру за раз.
Дополнительно: Если при запуске приложения возникает ошибка, сначала проверьте встроенные динамические ссылки - они могут содержать extend или include файлы, которых еще нет - то же самое с {% load static %}