class AlarmA(models.Model): user = models.ForeignKey(User) caption = models.CharField(max_length=30) alarmdate = models.DateField('Alarm date', blank=True, null=True) # other fields
Для каждого пользователя делается выборка, состоящая из всех его личных экземпляров модели (по полю User). Это делается элементарно, но есть одна проблема. В шаблоне нужно выводить список не в одном месте, а в трех, в зависимости от значения поля alarmdate, т.е. фактически разбить весь большоя список на три подсписка (3 группы).
1. Записи с заполненным значением alarmdate, где alarmdate меньше текущей даты.
2. Записи с заполненным значением alarmdate, где alarmdate равны или больше текущей даты.
3. Записи с незаполненным значением alarmdate.
Как я понимаю, при рендеринге нет возможности сравнивать даты с помощью существующих шаблонных фильтров и тегов.
Для себя нашёл два варианта решения.
1. Вьюха, произведенная от LstView возвращает список с одной из групп alarmdate (например, только не заполненные). Два других подсписка передаются в рендеринг через дополнительные контекст с помощью get_context_data. В этом случае имеем по сути три выборки во вью, но при обработке контекста каждый подсписок обрабатывается автономно от других.
2. Вьюха возвращает один общий список, но у каждого экземаляра в большом общем списке ставим маркер группы (например с помощью дополнительного поля и метода extra). В этом случае придётся в шаблоне трижды проходить один и тот же цикл, со своим условеым оператором для каждой секции шаблона.
Вопрос такой: какой из этих двух вариантов решения является оптимальным с точки зрения наименьшей нагрузки на сервер? Не знаю, имеет ли значение тип, если что у меня nginx+gunicorn+postgresql? И вообще, может быть напрасно парюсь, а есть решение лучше?