python - Django:重写 "User"类时没有这样的表

标签 python django

我正在使用 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 中执行了 makemigrationsmigrate 并运行了服务器。我打开管理页面并尝试编辑我之前创建的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']

我找到了一些帖子来解决这个问题。这些是我尝试过的方法:

  1. makemigrationsmigrate (同样的错误)
  2. migrate (appname) --fake (同样的错误)
  3. 将内容添加到 User 类中(/admin 中出现错误:没有这样的列)
  4. migrate --sync-db(同样的错误)
  5. migrate --run-syncdb(同样的错误)
  6. $ manage.py (appname) 0(失败:未知命令)
  7. 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/

相关文章:

python - 自定义验证器中的 XML ParseError : junk after document element: line 1, 第 11 列 (Wagtail)

python - 从Pandas数据框中仅解冻列的一部分

python - 按其中一个级别对多索引 Pandas 数据框进行分组?

python - Django 单元测试,未知列错误

python - django安装问题[python]

python - Django 表单字段到 HTML

python - 当 parse_dates 失败时,Pandas 会删除行

python - 使用YOLO实时检测,无法用OpenCV编译

python - Pytest:取消选择测试

python - Django - 日志配置