Роль 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.
댓글이 없습니다.