Django 自定义用户模型最佳实践 : User = get_user_model()?

标签 django

我正在尝试创建一个自定义用户类,我想知道实现引用新用户的最佳实践。在models.py中按照Django docs方法实现自定义用户如下:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

还有settings.py

AUTH_USER_MODEL = 'myapp.MyUser'

还有 admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)

Django 文档说要使用 settings.AUTH_USER_MODEL 代替 user 专门用于 ForeignKeys 和 OnetoOneField,但不清楚其他实例。

我的问题是关于如何在views.py 中引用自定义用户类。在定义我使用的用户类之前

from django.contrib.auth.models import User

但是在定义了一个自定义类之后,这就不再正确了。我在views.py的开头看到了样板代码使用这种方法:

from django.contrib.auth import get_user_model

User = get_user_model()

这是引用自定义用户的最佳做法吗?还是我应该只使用 settings.AUTH_USER_MODEL 来代替我之前拥有用户的位置?

最佳答案

使用 settings.AUTH_USER_MODEL 将在加载所有 django 应用程序后延迟加载用户类。当您的应用最初加载时在模块级别调用 get_user_model() 可能会导致用户模型应用未加载以及循环导入。

更新:我阅读了两个具体问题:

如何正确访问用户模型、贡献或自定义。

Django 的 get_user_model() 非常简单地调用 django.apps get_model()使用 settings.AUTH_USER_MODEL。如果您正在编写可能在其他项目中与其他用户模型重用的应用程序,请使用 get_user_model 调用。总是。那么用户模型是什么并不重要。

如果您已经创建了自己的 core.User 模型,并且非常有信心您的代码只会在这个项目中使用,那么 from core.models import User 可以作为出色地。

何时使用设置中的字符串表示而不是获取模型。

无论如何,字符串表示最终通常会调用相同的 django.apps get_model()。通过在 Foreignkeys、OneToOneFields 等中给出一个字符串而不是类本身,您根本不需要在 django 应用程序导入期间查找模型,其中用户模型可能尚不可用。因此,使用字符串表示只是延迟加载模型。所有型号都一样。

在 djangos 不同的主要版本中,这种行为也发生了变化,这是另一个话题。请注意,在 Django 1.11 中,get_user_model() 已针对导入使用进行了更新。

https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#referencing-the-user-model

关于Django 自定义用户模型最佳实践 : User = get_user_model()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45499641/

相关文章:

python - 如何在 Django 中上传文件并显示进度条?

python - 将 url 参数传递给序列化器

python - 如何在多个 Django 模型上进行 JOIN

python - CentOS上virtualenv使用pip安装遇到segmentation fault

Django 管理员登录特定网址

python - celery (Redis)结果后端不工作

jquery - Django 从复选框形式查询字符串数组

django - 如何在Django中上传文件并根据格式保存在不同的位置? (jpeg 和文档)

python - 无法导入名称 HttpResponse

python - 在 Django 管理员中,如何在模型管理员上隐藏“保存并继续”和“保存并添加另一个”按钮?