self.model () в пользовательском пользовательском менеджере django - PullRequest
0 голосов
/ 04 июля 2018

Итак, я довольно новичок в Джанго. Несмотря на то, что мой код работает после следования документации 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 голосов
/ 04 июля 2018

Хорошо, что вы определяете здесь, это класс MyUserManager. Это наследуется от BaseUserManager класса [GitHub] . Это подкласс класса Manager [GitHub] . Вы на самом деле используете менеджер все время. Например, 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 экземпляр со значениями поля 3 июля 2018 года как date_of_birth, а 'bob@work.com' как email.

Таким образом, здесь вы обычно создаете экземпляр User (или экземпляр другой модели, которую вы использовали для представления User с). Затем вы позже используете user.save(), чтобы сохранить этот экземпляр в базе данных и вернуть его.

...