2010-02-01 3 views
0

날짜 필드가있는 기사 모델이 있습니다. 모든 Article 개체에 대해 쿼리를 수행하고 각각의 고유 한 연도와 그 이후의 각 달에 반환되는 데이터 형식을 원합니다. 예컨대Django ORM을 사용하여 날짜 별 개체 정렬 및 그룹화

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

이 가능한가?

+0

나는 원시 MySQL의 쿼리 (YYYY_MM 같은 떨어지게)를 사용하여 새 필드를 만들 수있는 아이디어를 가지고 그 후에 아카이브를 채우기 위해'map'을 사용합니다. –

답변

0

빠른 해결책은 없지만 dates() 방법을 확인할 수 있습니다.

+0

예를 들어, Model.objects.dates ('pub_date', 'month')의 날짜에 대해 month,'[(date, Model.objects.filter (pub_date__year = date.year, pub_date__month = date.month) ')]'('date, QuerySet)'튜플을 매월 (당신의 필드 이름이'pub_date'라고 가정 할 때) 얻을 것이다. – LeafStorm

4

이런 종류의 질문은 상당히 자주 제기되는 것 같습니다. 가장 쉬운 솔루션은 데이터를 반복하고 개체를 연도 및 월별로 그룹화하는 것입니다. 보기에서 직접이 작업을 수행하거나 템플릿에 regroup을 사용할 수 있습니다. 그것은 정말로 당신이 데이터로 무엇을하고 싶은지에 달려 있습니다.

응용 프로그램에서 연도 및 월별 아카이브를 그룹화하는 것이 매우 일반적인 경우 save()에서 채울 연도 및 월 필드를 만드는 것이 좋습니다. 나는 개인적으로 논리를 넣어 시도 할 것이다

{% 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 %} 

:

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를 사용하여 템플릿에 모든 그룹의 논리를 밀어 :

는 손으로는 다음과 같이 될 수있다 템플릿 대신보기에서 여기

몇 가지 관련 게시물이 있습니다 :