Ответ 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()
Логически эти функции должны быть связаны прежде всего с разделением или переопределением существующих наборов запросов модели запроса. В ситуациях, когда вы не работаете с существующими наборами запросов, вы вообще не хотите возвращать набор запросов, или вам, возможно, придется выполнить некоторую связанную логику, которая не включает эту конкретную модель, чем модельный менеджер, который лучше подходит.