应用程序依赖于没有迁移的应用程序:%s"%key [0])在Django中。

4

我需要创建自定义用户。我正在使用带有AbstractUser的用户模型:

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.html import escape, mark_safe


class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

settings.py:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.humanize',

    'crispy_forms',

    'backend.classroom',
]

我认为问题出在以下这行代码:
AUTH_USER_MODEL = 'classroom.User'

错误:

File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 82, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/db/migrations/loader.py", line 49, in __init__
    self.build_graph()
  File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/db/migrations/loader.py", line 226, in build_graph
    self.add_external_dependencies(key, migration)
  File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/db/migrations/loader.py", line 191, in add_external_dependencies
    parent = self.check_key(parent, key[0])
  File "/home/davi/.local/share/virtualenvs/django-vue-template-Wl6a6m2J/lib/python3.6/site-packages/django/db/migrations/loader.py", line 173, in check_key
    raise ValueError("Dependency on app with no migrations: %s" % key[0])
ValueError: Dependency on app with no migrations: classroom

提示:应用程序类是在后端文件夹中的。我也尝试了以下代码:

AUTH_USER_MODEL = 'backend.classroom.User'

你执行了 makemigrationsmigrate 吗? - dirkgroten
是的,如果您的应用程序是“backend.classroom”,那么模型将是“backend.classroom.User”。 - dirkgroten
1
我“假设”这个应用程序实际上是classroom,并且有后端和前端目录,一个用于Django应用程序,另一个用于任何前端代码。 - AKX
您是在现有的应用程序中进行更改,其中已经存在用户模型吗? - dirkgroten
是的,但显示错误,并使用AUTH_USER_MODEL = 'backend.classroom.User'。 - Davi Luis
2个回答

9
在将classroom应用程序声明为AUTH_USER_MODEL之前,尝试为其创建初始迁移,因为通常依赖于auth.User的任何内容现在都依赖于classroom.User
$ python manage.py makemigrations classroom

3
引用Django文档:“不要忘记将AUTH_USER_MODEL指向它。在第一次创建任何迁移或运行manage.py migrate之前要这样做。” 如果在设置AUTH_USER_MODEL之前运行迁移,将会使用错误的模型创建用户表,这将变成一个麻烦事。对于makemigrations命令来说并不重要,但是在现有应用程序中添加自定义用户模型并不是一项简单的任务 - dirkgroten
2
非常好的观点,@dirkgroten。我实际上在那种情况下有一个相关的答案,因为我曾经自己处理过它...https://dev59.com/o1YN5IYBdhLWcg3wsZ1R#53460421 - AKX
希望 OP 正在进行一个新项目,而不是现有的项目 :-) 但我之前还没有见过 migrations.SeparateDatabaseAndState 这个技巧,非常酷。 - dirkgroten
1
请查看以下链接:https://dev59.com/XF8e5IYBdhLWcg3whqzl - E_K

0

你的错误可能在应用程序安装方面? 你正在使用课堂作为应用程序,后端是项目?如果是这样,那么正确的配置应该是安装应用程序

INSTALLED_APPS = [
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,
    django.contrib.humanize,
    crispy_forms
    classroom,
]

AUTH_USER_MODEL = classroom.User #classroom is app while User is the model

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接