2011-08-13 6 views
0

私は3つのモデルを持っています。ホーム私は彼らがこれらのモデルに関連付けられているすべて/最新の新しいエントリがトップになることを、このような順序でテンプレートに表示するホームビューから、このdjangoでの複雑なクエリ異なるモデルからのビュー

interviews = Interviews.objects.all().order_by('pub_date')[:3] 
publications = Publications.objects.all().order_by('pub_date')[:3] 
published = Published.objects.all().order_by('pub_date')[:3] 

のように取得しています。

インタビューエントリ10は、これらのすべてのモデルの中で最も最近のエントリがある場合、それは初めてとなるように、そして公表一つは、それは...第二など.etc

できる任意の1になり、最近の第二の場合それをする方法を教えてください?

答えて

0

他の要件に応じて、それらを共通のスーパークラスのサブクラスにすることをお勧めします。共通の要素が含まれています。

それが有効かどう言うのは難しいのですが、あなたがしなければ、あなたは彼らがsublcass何の9つの最初のオブジェクトのregerdlessをレンダリングします

SuperClass.objects.all().order_by('-pub_date')[:9] 

を呼び出すことにより、別々にまたは一緒に異なるタイプのオブジェクトを照会することができます。もちろん、スーパークラスがSuperClassであると仮定します。もちろん、これは各モデルの3つがあることを保証しません。

これを解決するもう一つの簡単な方法 - ただし、クエリを使用していないとしても、単にリストを並べ替えるだけです。

entries = sorted(list(interviews) + list(publications) + list(published), key=lambda x: x.pub_date, reverse=True) 

は、基本的にリストに変換して並べ替える必要があります。

+0

iがカテゴリ名として印刷することができますので、私はインタビューのようなサブクラスの名前を得ることができるどのような方法があります – themunna

+0

[model inherticance in docs](https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance):Superclassオブジェクトからサブクラスを取得するには、単にentry.interviewを使用できます。 entry.publicationまたはentry.publishedそれぞれのサブクラスオブジェクトを取得します。インタビューの場合、他の2つは設定されません。 – niklasdstrom

+0

ちょっとこのソリューションを使用しましたが、スーパークラスは使用しませんでした – themunna

0

1つの可能な方法でデータをソートするためにラムダを使用しているが、あなたのpythonにこれをやってますので、コストがhiherある、ないDBMS ...

lst = [] 
lst.extend(list(Interviews.objects.order_by('pub_date')[:10])) 
lst.extend(list(Publications.objects.order_by('pub_date')[:10])) 
lst.extend(list(Published.objects.order_by('pub_date')[:10])) 
# take 10 records for each, since you could not know how many records will be picked from which table 
# now order them... 
lst.sort(lambda x, y: cmp(x.pub_date, y.pub_date)) 
# and reverse the order, so newset is the first... 
lst.reverse() 

これはあなたのオブジェクトのリストを与えるPYを命じましたPUB_DATE、あなたが望む任意の数のレコードを取得するには、最終的なリストをスライスすることができますので...

lst = lst[:10]