2010-02-01 2 views
0

У меня есть модель статьи, в которой есть поле даты. Я хочу запросить все объекты статьи и иметь тип данных, возвращаемый с каждым отчетным годом, а затем каждый отдельный месяц в нем.Сортировка и группировка объектов по дате с помощью Django ORM

, например

archives = { 2009: {12, [, , ...], 11: [...]}, 2008: {12, [...], 11: [...]}, }

это возможно?

+0

У меня есть идея создать новое поле, используя необработанный запрос MySQL (л как YYYY_MM) и после этого используйте 'map' для заполнения переменной архива. –

ответ

0

Существует не быстрое решение, но вы можете проверить метод dates().

+0

Например, если вы хотите его в течение месяца, '[(date, Model.objects.filter (pub_date__year = date.year, pub_date__month = date.month)) для даты в Model.objects.dates ('pub_date', 'month ')] 'вы получите список кортежей' (date, QuerySet) для каждого месяца (при условии, что ваше поле называется 'pub_date'). – LeafStorm

4

Этот вопрос возникает, как правило, довольно часто. Самое простое решение - пропустить данные и сгруппировать объекты по годам и месяцам. Вы можете сделать это вручную в представлении или используя regroup в своем шаблоне. Это зависит от того, что вы хотите делать с данными.

Если группировка архивов по годам и месяцам очень распространена для вашего приложения, вы можете захотеть создать поле года и месяца, которое вы заполняете в файле save().

Рукой это может быть что-то вроде этого:

arch = {} 
for a in Archive.objects.all(): 
    year = arch.get(a.pub_date.year, {}) 
    month = year.get(a.pub_date.month, []) 
    month.append(a) 
    year[a.pub_date.month] = month 
    arch[a.pub_date.year] = year 

Или толкая всю логику группирования в шаблон с помощью regroup (непроверенные):

{% regroup archives by pub_date.year as year_list %} 
{% for year in year_list %} 
    Year: {{ year.grouper }} 
    {% regroup year.list by pub_date.month as month_list %} 
    {% for month in month_list %} 
    Month: {{ month.grouper }} 
    {% for archive in month.list %} 
     {{ archive }} 
    {% endfor %} 
    {% endfor %} 
{% endfor %} 

Я бы лично попытаться поставить логику в представлении вместо шаблона.

Вот несколько связанных сообщений: