如果它是类属性,我如何以自身身份访问此电子邮件属性?



如果它是类属性,我如何才能将电子邮件打印为 self.email?难道我们不必通过超级函数将其传递给父类 init 或创建我们自己的 init 来做到这一点吗?

class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=100, unique=True)
# Required fields
date_joined = models.DateTimeField(verbose_name="date_joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="last_login", auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email 

简短的回答是,Django 用一个描述符(用于管理类的属性)替换了我们声明的字段,该描述符执行获取/设置正确值的任务。

长答案是Model类有一个名为ModelBase的自定义元类(控制类创建的类)。ModelBase对所有具有contribute_to_class方法的对象调用add_to_class,模型字段(以及 Django 中的许多其他类)确实具有此方法,因此add_to_class调用它们,进而调用具有以下行 [GitHub] 的contribute_to_class,用描述符替换:

if self.column:
setattr(cls, self.attname, self.descriptor_class(self))

这是指向用于大多数模型字段的描述符的源代码 [GitHub] 的链接。

相关内容

最新更新