Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.12 Пользовательские менеджеры моделей
2 из 2 шагов пройдено

Что такое менеджер моделей Django?

Диспетчер моделей Django — это интерфейс, через который операции запросов к базе данных выполняются для моделей Django.

Другими словами, менеджер моделей Django — это экземпляр класса Manager, который позволяет нам взаимодействовать с моделями Django посредством операций запросов к базе данных.

В каждой модели приложения Django существует по крайней мере один менеджер моделей. Модель Django может иметь более одного менеджера. Ваша модель может иметь менеджера по умолчанию и добавлять некоторые дополнительные менеджеры, которые вы определяете.

Диспетчер моделей Django — один из основных инструментов Django ORM, который используется разработчиками для взаимодействия с базой данных.

Имя диспетчера моделей Django

По умолчанию Manager класс добавляет менеджера к каждой вызываемой модели objects, но если вы хотите использовать объекты в качестве поля модели или хотите использовать другое имя менеджера модели вместо объектов, вам необходимо переименовать его в соответствии с моделью.
Чтобы переименовать менеджер моделей в Django, вам нужно создать экземпляр класса Manager в модели Django.

Диспетчер моделей Django по умолчанию

Без смены менеджера моделей в DjangoDjango делает доступным objects менеджер моделей по умолчанию для каждой модели Django.
Как вы можете видеть в приведенной ниже модели Employee, мы не изменили объекты менеджера модели по умолчанию, поэтому вы можете выполнять все операции с базой данных через диспетчер модели объектов.

class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.SmallIntegerField(null=True)
    created = models.DateTimeField(default=timezone.now)
    work_experience = models.SmallIntegerField(default=0)
    contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
    department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
    compensations = models.ManyToManyField(Compensation)
    def __str__(self):
        return f'{self.first_name} {self.last_name}'

В данном случае, мы обращаемся к нашей модели через стандартный менеджер:

Чтобы изменить менеджер моделей Django по умолчанию, вам необходимо создать экземпляр класса models.Manager() внутри модели Django.  В приведенной ниже модели Django, как вы можете видеть, как я меняю менеджер модели по умолчанию с objects на persons.

class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.SmallIntegerField(null=True)
    created = models.DateTimeField(default=timezone.now)
    work_experience = models.SmallIntegerField(default=0)
    contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
    department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
    compensations = models.ManyToManyField(Compensation)
    persons = models.Manager()
    
    def __str__(self):
        return f'{self.first_name} {self.last_name}'

Теперь вы можете видеть в приведенном выше примере, что мы успешно изменили диспетчер моделей, поэтому мы не можем использовать Employee.objects оператор для взаимодействия с базой данных. Когда мы попытаемся использовать его, Employee.objects будет сгенерировано исключение AttributeError.

 

Использование диспетчера моделей Django

Чтобы использовать диспетчер моделей Django по умолчанию или пользовательский менеджер моделей для выполнения операций запросов к базе данных, вы должны следовать базовому синтаксису, показанному ниже.

django_model_name.model_manager_name.manager_method

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

Employee.persons.all()

В следующем шаге мы расширим возможности нашего менеджера.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.