2011-06-21 34 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的价值,然后你就可以为了通过获得5个最注释的类别最近的类别。

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

+0

+1最干净的回答 –

+0

+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/

+0

我不想使用随机类别。我需要最近更新的50个类别中的5个。如果我发布到同一类别的所有10个最新帖子,在主页上,我只需要显示来自此类别的最近一篇文章以及来自其他类别的最近4篇更新的帖子 - 每个类别一个帖子。 – 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”,以查看系统中的帖子数量。

0

荡涤的文件的代码版本:

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

非常酷......:D –

0

使用order_by和​​:

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

然后对categorydate领域的表现将指数一起。

但我认为真正的生产方式是使用Redis缓存和更新ID的最新类别的职位列表。