为了账号安全,请及时绑定邮箱和手机立即绑定

Django:重写“User”类时没有这样的表

Django:重写“User”类时没有这样的表

慕婉清6462132 2023-08-08 16:29:19
我正在使用 Django 3.1 制作一个 Django 项目。我试图User用 Django 重写该类。这是我在 中写的app_questions/models.py:import django.contrib.auth.modelsfrom django.contrib.auth.models import AbstractUserclass User(AbstractUser):    #passsettings.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'我还在superuser做这些之前创建了一个。之后我makemigrations在migratecmd中运行了服务器。我打开管理页面并尝试编辑User我之前创建的,但是当我单击编辑页面时,出现此错误:OperationalError at /admin/app_questions/user/1/change/no such table: app_questions_user_groupsRequest Method: GETRequest URL:    http://127.0.0.1:8000/admin/app_questions/user/1/change/Django Version: 3.1Exception Type: OperationalErrorException Value:    no such table: app_questions_user_groupsException Location: C:\Users\*\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\sqlite3\base.py, line 413, in executePython Executable:  C:\Users\*\AppData\Local\Programs\Python\Python37-32\python.exePython Version: 3.7.4Python 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: 中的错误no such column)migrate --sync-db(同样的错误)migrate --run-syncdb(同样的错误)$ manage.py (appname) zero(失败Unknown command:)migrate --fake (appname) zero(同样的错误)他们都没有解决问题。2016年或2017年的帖子现在好像已经不起作用了。如果这是重复的帖子,我们将不胜感激并抱歉。
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

当您运行第一个migrate命令时,所有默认迁移将生效,这意味着将创建所有表和关系

当您自定义默认模型User(覆盖默认User模型并为其提供值AUTH_USER_MODEL)时,所有关系都会发生变化

创建数据库表后更改 AUTH_USER_MODEL 会变得更加困难,因为它会影响外键和多对多关系

不建议中途更改用户模型,因为您需要手动修复数据库架构。

如果您中途更改了用户模型,解决此问题的最简单方法是:删除所有迁移、数据库并运行 makemigrations 和 migrate 命令。这创建了一个新的数据库模式。

这是文档中所说的限制:

由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_MODEL引用的模型必须在其应用程序的第一次迁移中创建(通常称为0001_initial);否则,您将遇到依赖性问题。

来自文档:

  • 自定义用户模型

  • 在项目中更改为自定义用户模型

最佳实践是在项目开始时创建自定义用户模型,然后稍后迁移并处理用户模型,以防稍后更改与身份验证或用户模型相关的任何内容


查看完整回答
反对 回复 2023-08-08
?
心有法竹

TA贡献1866条经验 获得超5个赞

此错误通常意味着您的迁移出了问题,并且当您在事后尝试进行此类更改时经常会发生此错误。一种可能的解决方案是删除除以initial.py. 一次makemigrations又一次migrate,它应该有效。



查看完整回答
反对 回复 2023-08-08
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果我没理解错的话,你的项目已经在运行了,那就是 makemigration 不是第一次 makemigration。如果是这样,请尝试删除数据库并再次运行 makemigration(也许在测试开发环境中),只是为了检查问题。如果这个工作(并且应该)你已经发现了问题。如果您不想删除数据库,也许您可以扩展用户而不是覆盖。

查看完整回答
反对 回复 2023-08-08
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信