因此,我是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
...
答案 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
将该实例保存到数据库中,并返回它。