重置迁移和数据库后如何修复 Django Auth/CustomUser 的错误?

How to fix errors for Django's Auth/CustomUser after resetting the migrations and db?

在尝试设置 CustomUser 和多对多关系之后,我决定对模型进行一些(后来证明是主要的)更改。我读过 CustomUser/Auth 需要先设置,否则会很乱。但是因为我只是在学习,几乎没有涉及任何数据,所以我只是去做了——不是故意搞乱 CustomUser 模型,而是我更改了模型名称——并且(也许这是严重错误)我更新了到处都是名字。现在我删除并重置了数据库、VENV 文件夹、所有迁移(以及 __pycache__)文件,并多次重新创建测试数据,以至于我认为我可以下载 GitHub 存储库并进行设置一个全新的应用程序很容易再次。但是该应用程序拒绝 运行 并一直要求缺少 table.

重新创建应用程序不是我主要关心的问题-我想了解发生了什么-缺少什么table(请参阅错误代码片段)?并且:为什么一个完好无损的回购与丢失的 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
  2. 的应用程序
  3. 运行 python manage.py makemigrations 但这次你决定下一个应用程序是按照你编写模型的方式进行的,他们按顺序进行迁移' 3)运行pythonmanage.py制作迁移 4) 最后 运行 python manage.py 迁移

...这就是我解决这个问题的方式 运行 遇到这个问题

显然不能随便乱用 Django 中的 CustomUser 模型,但这是一次很好的学习经历。所以对于刚入门的不小心卡在同一个地方,Ogechuwku Matthew 的回答是一个好的开始。

至elaborate-this是我做的:

  1. 删除了所有迁移文件,包括 __pycache__ 中的文件(__init__ 文件除外。
  2. 禁用了 settings.py 中的 AUTH_USER_MODEL = 'myapp.MyCustomUser' 行 这一步很关键。
  3. 删除(或注释掉)除了最重要的文件之外的所有文件。
  4. 注释掉除 CustomUser 模型和从中扩展的模型之外的所有模型。
  5. 运行 python manage.py makemigrations <app_name> 然后'python manage.py 迁移`
  6. 第 4 步成功后,再次 运行 python manage.py makemigrations <app_name>python manage.py migrate
  7. 将其余文件移回原处,从最简单的位开始,例如 views.py 中的 'HomeView' 和 'home.html'.
  8. 当应用程序以 'home.html'、un-commented 模型、视图和 url 一次启动一个集群时。

此外:如果 运行 应用程序发生错误,首先检查嵌入的动态链接——它们可能 extendinclude 文件不存在 yet-same {% load static %}