Недавно натолкнулся на часто востребованную операцию "получить следующее по дате" в моих Django-моделях. Встроенный менеджер objects имеет прекрасный метод latest. Симметричного ему , что-то типа next, я не нашел (может плохо искал).
И так как сейчас я как раз в самом разгаре прокачки django-скиллов (подобно новому персонажу в diablo , когда ну очень много нового и очень быстро происходят level-апы :), то я с радостью покопал тему расширения функционала менеджера и сделал нужный мне метод.
#models.py
#Менеджер (обратите внимание на базовый класс)
class EventManager(models.Manager):
def next(self):
import datetime
try:
return Event.objects.order_by('date').filter(date__gte=datetime.datetime.now())[0]
except:
return None
#Модель, для которой нужен метод next
class Event(models.Model):
title = models.CharField()
date = models.DateTimeField()
objects = MatchManager() #Явно указываем, кто нами рулит
После этого в соответствующем view я спокойно могу использовать:
Event.objects.next(), что гораздо удобнее и менее хрупко , чем конструирование фильтра.
Пара пояснений, любая модель, пронаследованная явно или опосредованно от models.Model имеет поле objects, значением которого является встроенный менеджер модели (объект класса models.Manager), который имеет кучу полезных методов. Мы создали класс-потомок и чуток его дополнили.
При желании можно параметризовать поле, по которому будет искать объекты метод next - подобно тому, как это делает latest. Но пока этого не требовалось, буду тратить время на что-то другое.
Что такое менеджер модели, во всяком случае, мне стало чуток понятнее =)