Что такое "Менеджер" в django?

Я прочитал определение в официальной документации Django documentation и все еще не уверен, что делает Manager.

В документации сказано, что они позволяют вам работать с таблицами/моделями базы данных. Но я до сих пор не понимаю этого.

Может кто-нибудь объяснить менеджерам и их роль мне? Ответ с примером будет предпочтительнее.

Ответ 1

Менеджер обычно является чем-то скрытым от программистов django, которые django использует для взаимодействия между кодом model и бэкэндом базы данных.

Когда вы отправляете запрос в django ORM, вы делаете это через вызовы

from my_app.models import MyModel

mms = MyModel.objects.all()

В этом случае часть функции objects возвращается менеджером. Если вы хотите, чтобы MyModel получал только экземпляры blue MyModel (база данных может также содержать модели red), вы можете создать менеджера и таким образом взломать вашу модель

class BlueManager(models.Manager):
    def get_query_set(self):
        return super(BlueManager, self).get_query_set().filter(colour='Blue')

class MyModel(models.Model):
     colour = models.CharField(max_length=64)
     blue_objects = BlueManager()

и звонит

MyModel.blue_objects.all()

будет возвращать только объекты с colour как blue. Обратите внимание, что это очень плохой способ фильтрации моделей!

Обычно нужно изменить интерфейс Manager, если они собираются изменить QuerySet, который обычно возвращает менеджер, или если вам нужно добавить запросы уровня "таблицы" (а не обычный уровень "строки" django). документация для менеджеров довольно полная и содержит несколько примеров.

Ответ 2

Менеджер - это своего рода "ворота" между приложением и базой данных. Одним из приятных моментов является то, что вы можете определить свой собственный базовый набор запросов для модели. Например: если у вас есть модель "Книга" с полем "доступность", вы можете подготовить собственный набор запросов, который отфильтрует определенный тип доступности:

models.py:

class AvailableBookManager(models.Manager):
    def get_query_set(self):
        return super(AvailableBookManager, self).get_query_set().filter(availability=1)

class Book(models.Model):
   (...)#fields definition

   objects = models.Manager() #default manager
   available_objects = AvailableBookManager() #own manager

и теперь вы можете использовать:

books = Book.available_objects.all()

вместо:

books = Book.objects.filter(available=1)