Django自定义UserManager中的self.model()

时间:2018-07-03 21:35:33

标签: python django authentication django-authentication django-users

因此,我是Django的新手。尽管我的代码在遵循Django文档“在Django中自定义身份验证”之后可以正常工作,但我不知道示例中的self.model(...)实际如何工作,它的来源以及如何与'自我”。

这是在文档底部找到的示例。

from django.db import models

from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)

class MyUserManager(BaseUserManager):
    def create_user(self, email, date_of_birth, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

   ->   user = self.model(
            email=self.normalize_email(email),
            date_of_birth=date_of_birth,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user
...

1 个答案:

答案 0 :(得分:2)

那么您在这里定义的是MyUserManager类。这是从BaseUserManager class [GitHub]继承的。这是Manager class [GitHub]的子类。实际上,您一直都在使用manager。例如SomeModel.objects是经理。

如果使用了管理器,则管理器具有对其管理的模型的引用。因此,SomeModel.objects是一个管理者,但是该管理者具有一个属性.model,该属性实际上是指回SomeModel类。

现在Python中的类通常是可调用的。例如,如果您呼叫int('42'),则呼叫int(..) 构造函数。在这种情况下,默认情况下,您的self.model将使用User模型(尽管可以覆盖)。

现在在Django中,模型的构造函数使用名为参数的参数来构造模型实例。如果您写User(date_of_birth=date(2018, 7, 3), email='bob@work.com'),则构造一个未保存的 User实例,其字段值作为2018年7月3日为date_of_birth'bob@work.com'作为{{ 1}}。

因此,通常在这里构造一个email实例(或用来表示User的另一个模型的实例)。然后,您稍后使用User将该实例保存到数据库中,并返回它。