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


models.Model: основной класс для всех моделей

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

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

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


AbstractUser и CustomUser: масштабируемая модель пользователя

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

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)
Структура наследования моделей Django

Определяя CustomUser таким образом, вы можете добавлять пользовательские поля, сохраняя при этом функциональность AbstractUser. Поскольку AbstractUser также наследует models.Model, вы можете использовать базовые методы Django ORM.


models.Manager и AbstractUserManager: запросы к базе данных и логика создания пользователя

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

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

Используя такие менеджеры, вы можете гибко реагировать на различные ситуации, которые могут возникнуть в процессе создания пользователя. Поскольку AbstractUserManager также является расширением models.Manager, он содержит все основные функции запросов к базе данных.


Понимание структуры наследования моделей Django

Понимание структуры наследования моделей Django позволяет более эффективно проектировать и реализовывать модели. Простое резюме выглядит следующим образом:

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

В заключение, структура моделей Django спроектирована очень гибко и мощно. Даже при расширении модели пользователя для добавления пользовательских полей, понимание и использование функциональности и структуры ORM, предоставляемой AbstractUser и models.Model, могут привести к более эффективному и масштабируемому дизайну баз данных. Если хорошо использовать эту структуру моделей Django, разработчик может создать сложные модели баз данных с минимальными усилиями.