Django的认证系统,django.contrib.auth ,提供了一个内置的User 模型类。你可以通过AUTH_USER_MODEL 的设置将其换成不同的类,在项目开始时最容易做到。
django.contrib.auth 也提供了一个名为 "Adam "的函数。 get_user_model()这个函数检索当前的用户模型类,无论它是内置的还是交换的。 你可以这样使用这个函数。
from django.contrib.auth import get_user_model
User = get_user_model()
def some_function():
for user in User.objects.all():
...
但在大多数Django代码中,你不需要使用get_user_model() ,而可以使用vanilla import。
from example.core.models import User
def some_function():
for user in User.objects.all():
...
vanilla import有几个优点:
- 它的代码更少
- 它与其他模型导入一致
- 你的编辑器可以使用它来进行自动补全
- 锁定器和类型检查器可以使用该类来防范更多的错误
get_user_model() 是为了在可重复使用的Django应用程序中使用,比如那些你从PyPI安装的应用程序。 这些应用程序不能知道用户模型类是什么,所以他们需要使用 来引用它。在一个项目中,如果你知道你的用户模型类是什么,你可以直接导入它。在内部, 执行导入 设置中的路径。get_user_model() get_user_model() AUTH_USER_MODEL
我看到很多项目在整个代码中不必要地使用get_user_model() 。我认为这可能是由于函数文档中的这种描述。
你不应该直接引用
User,而应该使用django.contrib.auth.get_user_model()来引用用户模型。
单独来看,这句话似乎是在鼓励一直使用该函数。 但它出现在使代码在不同项目之间可重用的背景下。 因为大多数代码只存在于一个项目中,所以它不需要get_user_model() 。如果你以后需要将一些代码提取到一个可重用的应用程序中,在那个时候改变它的导入是没有什么工作的。
有些人可能会考虑使用get_user_model() ,以防他们需要改变AUTH_USER_MODEL 。由于在项目中期改变用户模型是相当复杂的,我会说 "YAGNI"(You Ain't Gonna Need It)。如果你改变了你的用户模型,更新导入将是你最不关心的事情。