【问题标题】:Django: How does it find the User model?Django:它如何找到用户模型?
【发布时间】:2018-08-30 20:08:35
【问题描述】:

我对 Django 中的AUTH_USER_MODEL 有一个问题: https://docs.djangoproject.com/en/dev/ref/settings/#auth-user-model

默认值为auth.User。但是,实际模型在auth.models.User。 Django 如何找到正确的类?

我问是因为当我通常在 Django 中使用模型时,我必须写from myapp.models import MyModel。那么,为什么auth.User 中的models 不需要AUTH_USER_MODEL

有人可以解释一下或显示使用它的代码吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    你在appmodels.py 文件中定义模型。这意味着您存储模型类的模块app.models。因此导入内容为:

    from app.models import MyModel
    

    本质上,Django 与此无关:这是 Python 从这些模块加载模块和类的方式。

    然而,Django 会加载 - 例如,当您运行服务器时 - 位于设置文件的 INSTALLED_APPS 列表中的应用程序(通常是 settings.py),因此会在它存储 Django 模型的地方构造一个“寄存器”,它以统一的方式命名它们:app_name.ModelName。这里没有理由指定models,因为模型是在models.py 中定义的,因此只会引入“噪音”。

    您可以使用apps.get_model [Django-doc]获取对模型类的引用

    from django.apps import apps
    
    apps.get_model('app_name', 'ModelName')

    然后它检查已加载模型的寄存器,并返回对模型的引用。

    当存在循环引用时,通过字符串进行链接很有用(有时是必需的)。例如,如果您有两个模型 AB,而 A 指的是 BandBthroughA(for example withForeignKeys), then one of the two models is defined first. This means that if you defineAfirst, it can not refer to theB` 类本身,因为那时它还不存在。在 Django 中,然后通过字符串指定模型。然后 Django 系统将首先加载模型,然后“打结”:通过将字符串替换为对实际模型类的引用来解析引用。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2017-08-05
      相关资源
      最近更新 更多