重置迁移和数据库后如何修复 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 你必须要合乎逻辑
- 运行 python manage.py makemigrations
的应用程序
- 运行 python manage.py makemigrations
但这次你决定下一个应用程序是按照你编写模型的方式进行的,他们按顺序进行迁移'
3)运行pythonmanage.py制作迁移
4) 最后 运行 python manage.py 迁移
...这就是我解决这个问题的方式 运行 遇到这个问题
显然不能随便乱用 Django 中的 CustomUser 模型,但这是一次很好的学习经历。所以对于刚入门的不小心卡在同一个地方,Ogechuwku Matthew 的回答是一个好的开始。
至elaborate-this是我做的:
- 删除了所有迁移文件,包括
__pycache__
中的文件(__init__
文件除外。
- 禁用了
settings.py
中的 AUTH_USER_MODEL = 'myapp.MyCustomUser'
行 这一步很关键。
- 删除(或注释掉)除了最重要的文件之外的所有文件。
- 注释掉除
CustomUser
模型和从中扩展的模型之外的所有模型。
- 运行
python manage.py makemigrations <app_name>
然后'python manage.py 迁移`
- 第 4 步成功后,再次 运行
python manage.py makemigrations <app_name>
和 python manage.py migrate
。
- 将其余文件移回原处,从最简单的位开始,例如
views.py
中的 'HomeView' 和 'home.html'.
- 当应用程序以 'home.html'、un-commented 模型、视图和 url 一次启动一个集群时。
此外:如果 运行 应用程序发生错误,首先检查嵌入的动态链接——它们可能 extend
或 include
文件不存在 yet-same {% load static %}
在尝试设置 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 你必须要合乎逻辑
- 运行 python manage.py makemigrations
- 运行 python manage.py makemigrations
但这次你决定下一个应用程序是按照你编写模型的方式进行的,他们按顺序进行迁移' 3)运行pythonmanage.py制作迁移 4) 最后 运行 python manage.py 迁移
...这就是我解决这个问题的方式 运行 遇到这个问题
显然不能随便乱用 Django 中的 CustomUser 模型,但这是一次很好的学习经历。所以对于刚入门的不小心卡在同一个地方,Ogechuwku Matthew 的回答是一个好的开始。
至elaborate-this是我做的:
- 删除了所有迁移文件,包括
__pycache__
中的文件(__init__
文件除外。 - 禁用了
settings.py
中的AUTH_USER_MODEL = 'myapp.MyCustomUser'
行 这一步很关键。 - 删除(或注释掉)除了最重要的文件之外的所有文件。
- 注释掉除
CustomUser
模型和从中扩展的模型之外的所有模型。 - 运行
python manage.py makemigrations <app_name>
然后'python manage.py 迁移` - 第 4 步成功后,再次 运行
python manage.py makemigrations <app_name>
和python manage.py migrate
。 - 将其余文件移回原处,从最简单的位开始,例如
views.py
中的 'HomeView' 和 'home.html'. - 当应用程序以 'home.html'、un-commented 模型、视图和 url 一次启动一个集群时。
此外:如果 运行 应用程序发生错误,首先检查嵌入的动态链接——它们可能 extend
或 include
文件不存在 yet-same {% load static %}