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

3
我将尝试创建一个自定义用户类,并想知道实现引用新用户的最佳做法。按照Django文档中在models.py中实现自定义用户的方法如下:
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文档指出应该在ForeignKeys和OnetoOneField中使用settings.AUTH_USER_MODEL代替user,但对于其他情况不太清楚。

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

from django.contrib.auth.models import User

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

from django.contrib.auth import get_user_model

User = get_user_model()

这是引用自定义用户的最佳实践吗?还是我应该在之前使用 User 的位置上使用 settings.AUTH_USER_MODEL ?


我认为这是为了使代码具备未来的可扩展性,因为您可以重复使用代码而无需跟踪类的名称,尽管我怀疑他们不会在不久的将来更改用户模型的名称。此外,文档还指出不建议创建自己的自定义用户类,而应该使用FK,除非您确实需要。 - arielnmz
1
我认为相反的是官方建议在开始项目时创建自定义用户类。 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project - William
1
大约在Django 1.7之后,我基本上总是通过创建自定义用户模型来未雨绸缪。在1.6或更早版本中,解决方法和建议有很大不同。 - D.Nibon
2个回答

8

使用settings.AUTH_USER_MODEL会在所有django应用程序加载后延迟加载用户类。在初始加载应用程序时,在模块级别调用get_user_model()可能导致用户模型应用程序未加载,并且存在循环导入。

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

如何正确访问用户模型,包括contrib或自定义模型。

Django的get_user_model()只是使用settings.AUTH_USER_MODEL调用django.apps get_model()。如果您编写的应用程序可能在其他项目中重复使用其他用户模型,请始终使用get_user_model调用。这样就不需要考虑用户模型是什么。

如果您已经创建了自己的core.User模型,并且非常确信您的代码仅将用于此项目,则from core.models import User也可以工作。

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

字符串表示通常最终会调用相同的django.apps get_model()。在Foreignkeys、OneToOneFields等字段中使用字符串而不是类本身,可以避免在django应用程序导入期间查找模型,因为用户模型可能尚不可用。因此,使用字符串表示只是对模型的延迟加载。所有模型都适用于此规则。
此外,在Django的不同主要版本中,这种行为已经发生了变化,这是另一个话题。请注意,在Django 1.11中,get_user_model()已更新以供导入使用。

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


我编辑了问题,使之更直接。那么实现这个只是把所有的"Users"替换成settings.AUTH_MODEL_USER吗? - William
谢谢,这正是我正在寻找的! - William

5
你可以使用get_user_model 替代 User
from django.contrib.auth import get_user_model

User = get_user_model()

get_user_model 返回此项目中活动的用户模型。

如果您修改了默认的 User 表(例如添加新字段),则需要使用 get_user_model,它将返回活动的 User 表。

顺便提一下,User 将从 django.contrib.auth.models 返回本机对象。


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