日付フィールドを持つ Article モデルがあります。すべての Article オブジェクトに対してクエリを実行し、データ型を年ごとに返してから、その中の月ごとに返したいと考えています。
例えば
archives = {
2009: {12, [, , ...], 11: [...]},
2008: {12, [...], 11: [...]},
}
これは可能ですか?
日付フィールドを持つ Article モデルがあります。すべての Article オブジェクトに対してクエリを実行し、データ型を年ごとに返してから、その中の月ごとに返したいと考えています。
例えば
archives = {
2009: {12, [, , ...], 11: [...]},
2008: {12, [...], 11: [...]},
}
これは可能ですか?
この種の質問はかなり頻繁に出てくるようです。最も簡単な解決策は、データをループしてオブジェクトを年と月ごとにグループ化することです。これは、ビューで手動で行うか、テンプレートで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 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 %}
個人的には、テンプレートではなくビューにロジックを配置しようとします。
関連する投稿をいくつか紹介します。
迅速な解決策はありませんが、dates()メソッドを確認できます。