При разработке приложений на 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)

Определяя 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 позволяет более эффективно проектировать и реализовывать модели. Простое резюме выглядит следующим образом:
models.Model
: базовый класс для всех моделей Django, сопоставляющийся с базой данных и предоставляющий функции ORM.AbstractUser
: абстрактный класс, наследующийmodels.Model
. СоздаваяCustomUser
, у вас есть возможность легко определить пользовательскую модель, включающую функцииmodels.Model
.AbstractUserManager
: менеджер, специализированный для создания пользователей, наследующий отmodels.Manager
. С его помощью вы можете легко настраивать логику создания пользователей.
В заключение, структура моделей Django спроектирована очень гибко и мощно. Даже при расширении модели пользователя для добавления пользовательских полей, понимание и использование функциональности и структуры ORM, предоставляемой AbstractUser
и models.Model
, могут привести к более эффективному и масштабируемому дизайну баз данных. Если хорошо использовать эту структуру моделей Django, разработчик может создать сложные модели баз данных с минимальными усилиями.
댓글이 없습니다.