我热衷于学习 Django 的源码,以从底层开始培养我的技能。
在用户模型中,它有 password属性。使用命令 from django.contrib.auth.models import User
,
我检查了模块django/models.py ,未能找到password = models.CharField()
,但最终在 django/base_user.py 中找到了
class AbstractBaseUser(models.Model):
password = models.CharField(_('password'), max_length=128)
last_login = models.DateTimeField(_('last login'), blank=True, null=True)
有趣的是,AbstractBaseUser
和BaseUserManager
被封装为一个单独的模块,而不是合并到models.py
中,尽管代码只有139行很长。
在base_user.py
中,它声称
""" This module allows importing AbstractBaseUser even when django.contrib.auth is not in INSTALLED_APPS."""
我无法理解它的想法。
这样设计模块有什么好处?
最佳答案
git blame
是回答此类问题的有用工具。
如果您对 base_user.py
进行 git Blame 操作,您可以看到注释已添加到 this commit 中,而 ticket 24564 是 ojit_a 的一部分。
正如该票所解释的,如果您想从 AbstractBaseUser
导入 ojit_code ,您必须将 django.contrib.auth.models
添加到 django.contrib.auth
。这是因为该模块包含非抽象模型,例如 INSTALLED_APPS
。
因此它被移动到一个单独的模块,这样就可以在不将 User
添加到 django.contrib.auth
的情况下导入它。
关于python - 为什么 AbstractBaseUser 放在单独的模块中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50604917/