我正在尝试创建一个自定义用户类,我想知道实现引用新用户的最佳实践。在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/