0

私が質問を正しく述べているかどうかさえわかりません。これが状況です。外部キー関係にアクセスして生成されたクエリセットがあります。Djangoドキュメントの標準のブログ/エントリモデルを使用して、ブログを選択し、一連のエントリがあるとします。

entries = Blog.objects.get(id=1).entry_set.all()

したがって、ブログにはいくつかのエントリがあり、おそらくゼロです。次に、カレンダーを作成して、ブログエントリがある日を示します。したがって、私の考えは、その月の日などのリストを繰り返し処理し、エントリのクエリセットでその日付のエントリを確認することです。質問は、これを行うための最良の方法は何ですか?私の最初の考えは次のようなことをすることでした

dayinfo = [] # we will iterate over this in the template
for curday in month:
  dayinfo.append({'day':curday, 'entry':entries.filter(day=curday)})

問題は、フィルター呼び出しが新しいクエリセットを返し、ループの反復ごとに新しいSQL呼び出しを生成することです。エントリが存在する場合はエントリからエントリオブジェクトを取り出して、カレンダーに貼り付ける必要があります。では、これを行うための最良の方法は何ですか?私はこれを機能させました:

dayinfo.append({'day':day, 'entry':[e for e in entries if e.day == curday][0]})

これでは、新しいSQL呼び出しは生成されません。しかし、それは確かに醜いようです。

4

1 に答える 1

2

すべてを1行にまとめたいという衝動に抵抗してください-コードは次のようなものでよりクリーンになると思います:

from collections import defaultdict
calendar = defaultdict(list)

for entry in entries:
    calendar[entry.day].append(entry)

defaultdictの部分は単純ですが、テンプレートでforループを使用することだけを計画している場合は、1か月のすべての日で初期化することをお勧めします。また、Django 1.1を使用している場合、個々の投稿へのリンクを実際に生成する予定がない場合は、新しいannotate()メソッドを使用して投稿数を単純に計算できることにも注意してください。

于 2009-09-04T14:49:06.973 に答える