Как исправить ошибки для 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, вы должны быть логичны с этим

  1. запустите python manage.py makemigrations <имя_приложения:приложение, содержащее AUTH_USER_MODEL>
  2. .
  3. запустите python manage.py makemigrations <app_name>, но на этот раз вы решаете, какое приложение будет следующим в том порядке, в котором вы написали свои модели, они делают makemigrations в этом порядке". 3)запустите python manage.py makemigrations 4)наконец, запустите python manage.py migrations
  4. .

... вот как я решаю эту проблему каждый раз, когда сталкиваюсь с ней

Очевидно, что возиться с моделью CustomUser в Django не стоит, но это был хороший обучающий опыт. Так что для новичков, случайно застрявших на одном месте, ответ Ogechuwku Matthew будет хорошим началом.

Подробнее - вот что я сделал:

  1. Удалите все файлы миграции, включая файлы в __pycache__ (ИСКЛЮЧАЯ файл(ы) __init__).
  2. Отключите строку AUTH_USER_MODEL = 'myapp.MyCustomUser' в settings.py Этот шаг является ключевым.
  3. Удалите (или закомментируйте) все файлы, кроме самых необходимых.
  4. Закомментировал все, кроме CustomUser модели и моделей, расширенных из нее.
  5. Выполнил python manage.py makemigrations <app_name> и затем 'python manage.py migrate'
  6. .
  7. После того, как шаг 4 сработал, выполнил python manage.py makemigrations <app_name> и python manage.py migrate снова.
  8. Переместил остальные файлы обратно, начиная с самых простых, таких как "HomeView" в views.py и "home.html".
  9. Когда приложение запустилось с 'home.html', удалите комментированные модели, представления и url по одному кластеру за раз.

Дополнительно: Если при запуске приложения возникает ошибка, сначала проверьте встроенные динамические ссылки - они могут содержать extend или include файлы, которых еще нет - то же самое с {% load static %}

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