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

时间:2021-08-01 19:57:11

标签: python-3.x django oop django-models

如果电子邮件是类属性,我如何将其打印为 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 

1 个答案:

答案 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}} 链接。