Django:查询来自不同类别的最新帖子

时间:2011-06-21 17:35:00

标签: django django-views

class Post(models.Model):
    title = ...
    category = models.ForeignKey(Category)
    date = .......

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

在主页面上,我想显示5个包含最新日期的帖子,但所有帖子必须来自不同的类别。例如,有50个类别。有可能吗?

5 个答案:

答案 0 :(得分: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的值注释类别,然后您可以按顺序获取最近的5个类别。

然后,只需遍历各个类别,然后为每个类别提取最新帖子。完成。

答案 1 :(得分:1)

你打赌它是可能的。

随机选择5个类别

抓取每个类别的最新帖子

也许是这样的:

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])

这可能有所帮助:https://docs.djangoproject.com/en/dev/ref/models/querysets/

答案 2 :(得分: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”。

答案 3 :(得分:0)

清理了Doc代码的版本:

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

答案 4 :(得分:0)

使用order_bydistinct

Post.objects.all().order_by('category', 'date').distinct('category')

然后在categorydate字段中将性能添加到一起。

但我认为真正的制作方式是使用Redis来缓存和更新id的最新类别帖子列表。