2011-06-21 17 views
1
class Post(models.Model): 
    title = ... 
    category = models.ForeignKey(Category) 
    date = ....... 

class Category(models.Model): 
    title = .... 

メインページには、最新の日付の投稿が5つ表示されますが、すべての投稿は異なるカテゴリのものでなければなりません。たとえば、50のカテゴリがあります。出来ますか?Django:異なるカテゴリの最新投稿を照会してください

+0

最近更新された5つのカテゴリをクエリし、後でこれらのカテゴリのそれぞれからトップポストを取得できませんでしたか? –

+0

カテゴリにフィールド "更新時間"がない...つまり、どういうわけか質問で検索できますか? – Friendka

答えて

6
from django.db.models import Max 

categories = Category.objects.annotate(most_recent=Max(post__date)).order_by('-most_recent')[:5] 

posts = list() 
for category in categories: 
    posts.append(category.post_set.latest()) 

most_recentの値として、最も最近の投稿の日付とカテゴリの注釈を付け:ドキュメントのコードのバージョンをクリーンアップ

+0

+1クリーンな答え –

+0

+1は私にはかなり見える –

1

可能でしょうか?

randposts = {} #list for most recent posts of 5 randomly selected categories 
for randomcat in Category.objects.order_by('?')[5:]: 
    randposts.add(Post.objects.filter(category = randomcat).order_by('date')[0]) 

これは役立つかもしれない:

ランダムグラブは、各カテゴリの最新記事は

おそらくのようなものは、5つのカテゴリー

を選択 https://docs.djangoproject.com/en/dev/ref/models/querysets/

+0

私はランダムなカテゴリを使いたくありません。最近更新された50のカテゴリのうち5つが必要です。私が同じカテゴリに投稿した10個の最新投稿すべて、ホームページにこのカテゴリーの最近の投稿が1つだけ表示されている必要があります。 – Friendka

+0

クールなものを作成するための+1。 – myusuf3

1

さて、再びこれを試してみましょう..

catsused = {} 
posts = {} 
postindex = 0 
posts.add(Post.objects.order_by('date')[postindex]) 
catsused.add(Post.objects.order_by('date')[postindex].category 

for each in range(1,5): 
    postindex = postindex + 1 
    post = Post.objects.order_by('date')[postindex] 
    while post.category in catsused: 
     postindex = postindex + 1 
     post = Post.objects.order_by('date')[postindex] 
    posts.add(post) 
    catsused.add(post.category) 

posts ## Now contains your posts 

それは私にとって恐ろしいコードのようですが、それに近いものが仕事をすると思います。あなたは、システム内にある投稿の数を上回る「postindex」を扱うためのコードをいくつか追加したいと思うでしょう。あなたはそれまでに注文が5最大限に活用することができ、

catsused = {} 
posts = {} 

for post in Post.objects.order_by('date'): 
    if post.category not in catsused: 
     posts.add(post) 
     catsused.add(post.category) 
     if len(catsused) == 5: 
      break 
0

最近のカテゴリ。

次に、カテゴリをループして、それぞれ最新の投稿を引き出します。完了しました。 order_byと​​を使用して

+0

非常にクールだ...:D –

0

パフォーマンスは categorydateフィールドで一緒にインデックスを追加するためのその後
Post.objects.all().order_by('category', 'date').distinct('category') 

しかし実際の生産方法は、Redisを使用して、最新のカテゴリの投稿のリストをキャッシュして更新することだと思います。

関連する問題