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

Sas*_*che 4 python authentication django 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
...
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 8

好吧,您在这里定义的是一个MyUserManager类。这是从BaseUserManager类[GitHub]继承的。这是Manager[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日的字段值为as date_of_birth'bob@work.com'as email

因此,您通常在此处构造一个User实例(或用于表示Users 的另一个模型的实例)。然后,您以后可以使用user.save()将该实例保存到数据库,然后将其返回。