Роль models.Model

Во-первых, самой базовой моделью класса в Django является models.Model. Все модели Django определяются как подклассы models.Model. Этот класс выполняет роль сопоставления определенной модели в таблице базы данных. Каждый класс модели является таблицей, а поля внутри него становятся столбцами таблицы.

Важно отметить, что наследуя models.Model, мы получаем множество полезных методов:

  • save(): метод для сохранения объекта в базе данных
  • delete(): метод для удаления объекта
  • objects.create(): метод для создания и сохранения нового объекта
  • objects.filter(): метод для получения объектов, соответствующих определенным условиям

Благодаря этим функциям, достаточно просто наследовать models.Model, чтобы легко использовать мощные возможности Django ORM.

Связь между AbstractUser и CustomUser

В Django есть встроенная модель пользователя auth.User, которая предоставляется по умолчанию. Эту модель можно использовать, но чаще всего пользователи хотят настроить модель. Например, может возникнуть необходимость добавить дополнительные поля, такие как номер телефона или адрес.

В этом случае используется AbstractUser. Этот класс является абстрактным, созданным для расширения встроенной модели пользователя Django (то есть auth.User). Поскольку AbstractUser также наследует models.Model, мы можем создать CustomUser, наследуясь от AbstractUser, и без проблем использовать все функции ORM.

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    address = models.CharField(max_length=255, blank=True)

Модель CustomUser, определенная таким образом, предоставляет все функции, связанные с аутентификацией пользователей, и позволяет свободно определять дополнительные поля.

Роли models.Manager и AbstractUserManager

В моделях Django models.Manager выполняет роль интерфейса для обработки запросов к базе данных. Через предоставляемый по умолчанию менеджер objects можно легко получать или изменять данные. Например, существуют методы filter(), get(), create().

Когда модель пользователя нуждается в логике создания пользователей, можно использовать AbstractUserManager. AbstractUserManager наследуется от models.Manager и предоставляет методы, специализированные для создания пользователей (create_user(), create_superuser()).

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Логика создания пользователя
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Логика создания суперпользователя
        pass

Настраивая логику создания пользователей, реализуя CustomUserManager, можно более гибко управлять моделью пользователя.

Итог: Связь между классами моделей

Подытожив, отношения между классами моделей Django можно описать следующим образом:

  • models.Model: базовый класс для всех моделей Django. Наследуя его, мы сопоставляем с базой данных и получаем функции ORM.
  • AbstractUser: абстрактный класс, наследующий models.Model. На основе него мы определяем CustomUser.
  • AbstractUserManager: позволяет настраивать логику создания пользователей, наследуясь от models.Manager.

Поняв и использовав эту структуру, можно более эффективно проектировать модельную систему Django.