【问题标题】:Django settings.AUTH_USER_MODEL defined in separate moduleDjango settings.AUTH_USER_MODEL 在单独的模块中定义
【发布时间】:2018-10-15 04:43:13
【问题描述】:

什么是我的AUTH_USER_MODEL的正确说法是什么?

我有以下套装:

文件夹结构:

--- 后端
----- api
-------- 型号
------------ 用户.py

user.py 位于 models 文件夹中

在 settings.py 中:

AUTH_USER_MODEL = 'myapp.User'

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'api',
]

型号:

class User:

    class Meta:
        app_label = "myapp"

当我运行任何 manage.py 命令时,例如

python manage.py showmigrations

我收到此错误:

LookupError: 没有安装标签为“myapp”的应用程序。

问题的解决方案是将 api 文件夹重命名为 myapp,由于模型名称的某些限制,我无法这样做。

或者将 AUTH_USER_MODEL 设置为 api.User,但这会导致所有数据表名称发生变化,并且必须保持不变

以“myapp_”开头的数据表名称不应更改

【问题讨论】:

  • 如果模型在 api 应用程序中,我不明白你为什么放“myapp.User”而不是“api.User”。
  • @DanielRoseman 我有理由:如果我更改为“api.User”,那么我将需要更新所有迁移并更改所有表名,这在生产中是不可取的。问题出在迁移中
  • 不,问题出在您的 AUTH_USER_MODEL 设置中。
  • 还有你的manage.py在哪里或者你的项目的根在哪里?是backend吗?
  • @trixn 是的,后端是根,manage.py 位于backend 文件夹中

标签: django python-3.x


【解决方案1】:

鉴于您的文件夹结构如下所示:

backend
└── api
|   ├── __init__.py
|   ├── apps.py
|   └── models
|       ├── __init__.py
|       └── user.py
├── manage.py
└── settings.py

然后你可以通过在backend/api/ 中创建一个名为apps.py 的文件来create an app config。在那里你可以重命名你的应用:

后端/api/apps.py

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = _('My App')

您还需要将其添加到该文件夹​​内的__init__.py

后端/api/__init__.py

default_app_config = 'api.apps.MyAppConfig'

此外,如果您想使用 myapp.User 作为您的用户模型,您还必须在 models 模块中导入:

后端/api/models/__init__.py

from .user import User
# or use "from .user import *" to import everything but then make sure you have __all__ defined in user.py

【讨论】:

  • 是的,完全一样的文件夹结构
  • ModuleNotFoundError: No module named 'myapp': apps.populate(settings.INSTALLED_APPS) -> app_config = AppConfig.create(entry) -> File "/Users/dmitri/Envs/chat3/lib/ python3.6/site-packages/django/apps/config.py",第 142 行,在创建 app_module = import_module(app_name)
  • 解决方案是更改 MyAppConfig(AppConfig) 类中的 AppConfig.label,因此如果您更新答案,我会接受。改名什么都没有,必须是代码所在模块的真实名称,但添加label = 'arbitrary_name'其实是解决办法
【解决方案2】:

解决方案是更改 MyAppConfig(AppConfig) 类中的 AppConfig.label,因此如果您更新答案,我会接受。改名什么都没有,必须是代码所在模块的真实名称,但是加上label = 'arbitrary_name'其实是解决办法

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2020-12-18
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2012-06-28
    • 2016-11-30
    相关资源
    最近更新 更多