Django:获取所有博客及其最新博客条目

时间:2010-08-06 18:14:56

标签: django django-models django-queryset

假设我有这两个模型:

class Blog(models.Model):
    name = models.CharField(max_length=64)
    # ...

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    added = models.DateTimeField(auto_now_add=True)
    # ...

现在我想获得所有博客的列表以及每个博客的最新博客条目。最好的方法是什么?

如果它有任何区别,我们可以假设每个博客至少有一个条目。

2 个答案:

答案 0 :(得分:0)

您可以使用相关经理的latest()方法:

blogs = Blog.objects.all()

a_blog = blogs[0]
latest_entry = a_blog.entry_set.latest()

# or...
latest_entries = [blog.entry_set.latest() for blog in blogs]

类似的东西。

答案 1 :(得分:0)

有一种环形交叉(非常hackish)的方式来做到这一点。如果您不介意取消规范化,可以在latest_entry模型中添加可选的Blog字段。然后,每次创建Entry.save()实例时,您都可以覆盖Blog以更新相应Entry实例的此字段。或者,您可以添加信号来执行此操作。

def save(self, *args, **kwargs):
    if not self.pk: #This object is being created, not updated.
        self.blog.latest_entry = self        
    models.Model.save(self, *args, **kwargs)
是的,它不干净。但它会减少查询次数。然后你可以这样做:

[(blog, blog.latest_entry) for blog in Blog.objects.all()]