Джанго Кастом Менеджер
Я смотрю на некоторый код, и мне любопытно, является ли это хорошей практикой.
class ToDoManager(models.Manager):
def scheduled(self):
"""
Returns QuerySet of all things to be done.
"""
return self.filter(...)
class ImpStuff(models.Model):
....model definition
objects=TodoManager
Я всегда видел, чтобы пользовательский менеджер переопределил метод get_query_set (перефразируя). Это хороший способ справиться с ситуацией?
2 ответа
Я делал это раньше. это работало нормально. так что, если вы не посмотрите на мой код, очевидно, что в мире есть два человека, которые находят это полезным.
это не альтернатива переопределению get_query_set
- предоставляет дополнительные способы получения (отфильтрованных) экземпляров. Вы можете сделать оба одновременно (в пределах разумного).
какие проблемы вы ожидаете?
PS этот подход также используется в Pro Django, стр. 274 и далее, где менеджер расширяется такими методами, как most_recent()
,
Использование менеджеров моделей для упаковки сложных запросов ORM является чем-то очень СУХИМЫМ и рекомендуется. Вы можете добавить параметры к этим методам и сэкономить много кода:
class ToDoManager(models.Manager):
def scheduled(self, start_date, end_date):
"""
Returns tasks to be done within two dates.
"""
return self.filter(...)
Тогда вы просто делаете:
todo_tasks = ImpStuff.objects.scheduled(datetime.now(), datetime.datetime.now() + datetime.timedelta(3))
Менеджеры используются во многих приложениях Django с открытым исходным кодом, доступных на Github.