Подтвердить что ты не робот

Когда следует использовать пользовательский диспетчер в сравнении с пользовательским QuerySet в Django?

В Django пользовательские Менеджеры - отличный способ организовать многоразовую логику запросов. В docs указано, что есть две причины, по которым вы можете настроить Диспетчер: добавить дополнительные методы Менеджера и/или изменить начальную Возвращает QuerySet Manager.

Однако далее описывается, как могут быть созданы пользовательские QuerySets и что они могут быть доступны непосредственно из модели данных, как менеджера через QuerySet.as_manager(). Экземпляр Manager, созданный QuerySet.as_manager(), будет практически идентичен PersonManager из предыдущего примера.

Похоже, существует большая гибкость в том, как можно организовать свою логику между пользовательским менеджером и/или пользовательскими QuerySets. Может ли кто-нибудь объяснить принципы, по которым я должен решить, когда использовать один против другого?

4b9b3361

Ответ 1

В основном, чтобы обеспечить легкий состав запросов. Как правило, если вы хотите выполнить некоторую операцию над существующим набором запросов в цепочке вызовов с запросом, вы можете использовать QuerySet.

Например, скажем, у вас есть модель Image с полями width, height:

class Image(models.Model):
    width = ...  # Width in pixels
    height = ... # Height in pixels

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

class ImageQuerySet(models.QuerySet): 
    def landscapes(self):
        return self.filter(width__gte=models.F('height'))

    def portraits(self):
        return self.filter(width__lte=models.F('height'))

    def small(self):
        return self.filter(width__lte=1200)

    def large(self):
        return self.filter(width__gte=1200)

class ImageManager(models.Manager):
    def get_queryset(self):
        return ImageQuerySet(self.model, using=self._db)

теперь вы можете легко создавать динамические запросы:

Image.objects.all().portraits().small()
Image.objects.all().large().portraits()

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