2009-09-04 10 views
0

よくわからない質問を正しく述べています。ここに状況があります。私は外部キーの関係にアクセスすることによって生成されたクエリセットを持っています。 Djangoのドキュメントに標準のブログ/エントリーモデルを使用して、のは、私がブログを選択し、現在のエントリのセットを持っているとしましょう:新しいクエリーセットを作成せずに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呼び出しを生成しません。しかし、それは確かに醜いようです。

答えて

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()メソッドを使用して投稿数を計算することもできます。

+0

ありがとう、それは私が必要としていたものです。これはDjangoの問題よりも一般的なコーディングの問題でした。私は、私がやろうとしていることをやるための簡単な方法があることを知っていました! – chacmool

関連する問題