我正在使用 Django 3.1 制作一个 Django 项目。
我试图在 Django 中重写User
类。这是我在 app_questions/models.py
中写的内容:
import django.contrib.auth.models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
#pass
settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_questions',
]
AUTH_USER_MODEL = 'app_questions.User'
在完成这些操作之前,我还创建了一个 super 用户
。
之后,我在 cmd 中执行了 makemigrations
和 migrate
并运行了服务器。我打开管理页面并尝试编辑我之前创建的User
,但是当我单击编辑页面时,出现此错误:
OperationalError at /admin/app_questions/user/1/change/
no such table: app_questions_user_groups
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/app_questions/user/1/change/
Django Version: 3.1
Exception Type: OperationalError
Exception Value:
no such table: app_questions_user_groups
Exception Location: C:\Users\*\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\sqlite3\base.py, line 413, in execute
Python Executable: C:\Users\*\AppData\Local\Programs\Python\Python37-32\python.exe
Python Version: 3.7.4
Python Path:
['C:\\Users\\*\\django_sample\\vitural_env\\zeaf',
'C:\\Users\\*\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip',
'C:\\Users\\*\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs',
'C:\\Users\\*\\AppData\\Local\\Programs\\Python\\Python37-32\\lib',
'C:\\Users\\*\\AppData\\Local\\Programs\\Python\\Python37-32',
'C:\\Users\\*\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages']
我找到了一些帖子来解决这个问题。这些是我尝试过的方法:
makemigrations
和migrate
(同样的错误)migrate (appname) --fake
(同样的错误)- 将内容添加到
User
类中(/admin 中出现错误:没有这样的列
) migrate --sync-db
(同样的错误)migrate --run-syncdb
(同样的错误)$ manage.py (appname) 0
(失败:未知命令
)migrate --fake (appname) 0
(同样的错误)
他们都没有解决问题。 2016 年或 2017 年的帖子现在似乎不再起作用了。
感谢任何帮助,如果这是重复的帖子,我们深表歉意。
最佳答案
当您运行第一个migrate
命令时,所有默认迁移都将生效,这意味着将创建所有表和关系。
当您自定义默认User
时(覆盖默认User
模型并向AUTH_USER_MODEL
提供值)所有关系会改变。
Changing AUTH_USER_MODEL after you’ve created database tables is significantly more difficult since it affects foreign keys and many-to-many relationships
不建议中途更改用户模型,因为您需要手动修复数据库架构。
如果您中途更改了用户模型,解决此问题的最简单方法是:删除所有迁移、数据库并运行 makemigrations 和 migrate 命令。这创建了一个新的数据库架构。
这是一个限制,文档中称:
Due to limitations of Django’s dynamic dependency feature for swappable models, the model referenced by AUTH_USER_MODEL must be created in the first migration of its app (usually called 0001_initial); otherwise, you’ll have dependency issues.
来自文档:
最佳实践是在项目开始时创建自定义用户模型,然后稍后迁移并处理用户模型,以防稍后更改与身份验证或用户模型相关的任何内容
关于python - Django:重写 "User"类时没有这样的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63917013/