猿问

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

我正在使用 Django 3.1 制作一个 Django 项目。


我试图User用 Django 重写该类。这是我在 中写的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'

我还在superuser做这些之前创建了一个。


之后我makemigrations在migratecmd中运行了服务器。我打开管理页面并尝试编辑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: 中的错误no such column

  4. migrate --sync-db(同样的错误)

  5. migrate --run-syncdb(同样的错误)

  6. $ manage.py (appname) zero(失败Unknown command:)

  7. migrate --fake (appname) zero(同样的错误)

他们都没有解决问题。2016年或2017年的帖子现在好像已经不起作用了。

如果这是重复的帖子,我们将不胜感激并抱歉。


慕婉清6462132
浏览 151回答 3
3回答

12345678_0001

当您运行第一个migrate命令时,所有默认迁移将生效,这意味着将创建所有表和关系。当您自定义默认模型User(覆盖默认User模型并为其提供值AUTH_USER_MODEL)时,所有关系都会发生变化。创建数据库表后更改 AUTH_USER_MODEL 会变得更加困难,因为它会影响外键和多对多关系不建议中途更改用户模型,因为您需要手动修复数据库架构。如果您中途更改了用户模型,解决此问题的最简单方法是:删除所有迁移、数据库并运行 makemigrations 和 migrate 命令。这创建了一个新的数据库模式。这是文档中所说的限制:由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_MODEL引用的模型必须在其应用程序的第一次迁移中创建(通常称为0001_initial);否则,您将遇到依赖性问题。来自文档:自定义用户模型在项目中更改为自定义用户模型最佳实践是在项目开始时创建自定义用户模型,然后稍后迁移并处理用户模型,以防稍后更改与身份验证或用户模型相关的任何内容

心有法竹

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

神不在的星期二

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

相关分类

Python
我要回答