, предполагая, что ваш db-движок поддерживает такие функции, как MONTH ()
, вы можете попробовать
импортировать sqlalchemy как sa DBSession.query (статья) .group_by (sa. func.year (Article.created), sa.func.month (Article.created)). all ()
else вы можете сгруппировать в python, как
from itertools import groupby def grouper (item): return item.created.year, item.created.month for ((год, месяц), элементы) в groupby (query_result, grouper): для элемента в элементах: # do stuff
Я знаю, что этот вопрос древний, но в интересах любого, кто ищет решения, вот еще одна стратегия для баз данных, которые не поддерживают такие функции, как MONTH ():
db.session. query (sa.func.count (Article.id)). \ group_by (sa.func.strftime ("% Y-% m-% d", Article.created)). all ()
По существу это превращает метки времени в усеченные строки, которые затем можно сгруппировать.
Если вам нужны только самые последние записи, вы можете добавить, например:
order_by (Article.created.desc ()). limit (7)
Следуя этой стратегии, вы можете легко создавать группы, такие как день недели, просто опуская год и месяц.
Ответ THC4k работает, но я просто хочу добавить, что query_result
должен быть уже отсортирован, чтобы получить itertools.groupby
, работая так, как вы хотите.
query_result = DBSession.query (Article) .order_by (Article.created) .all ()
Вот объяснение в itertools.groupby docs :
Операция groupby () аналогична фильтру uniq в Unix. Он генерирует разрыв или новую группу каждый раз, когда изменяется значение ключевой функции (поэтому, как правило, необходимо сортировать данные с использованием одной и той же ключевой функции). Это поведение отличается от SQL GROUP BY, которое объединяет общие элементы независимо от их порядка ввода.
blockquote>