如果电子邮件是类属性,我如何将其打印为 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
答案 0 :(得分:1)
简短的回答是 Django 用一个 descriptor(用于管理类的属性)替换我们声明的字段,该 metaclass 执行获取/设置正确值的任务。
长的答案是 Model
类有一个名为 ModelBase
的自定义 lines [GitHub](控制类创建的类)。 ModelBase
在所有具有 add_to_class
方法的对象上调用 contribute_to_class
,模型字段(以及 Django 中的许多其他类)确实具有此方法,因此对它们调用 add_to_class
依次调用 contribute_to_class
,它具有以下 source code [GitHub],用描述符进行替换:
if self.column:
setattr(cls, self.attname, self.descriptor_class(self))
这是大多数模型字段所用描述符的 {{3}} 链接。