2010-08-06 99 views
2

假设我有这两种模式:Django的:获取所有博客和自己的最新博客文章

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) 
    # ... 

现在我想对每个相应的博客最新的博客条目相处的所有博客的列表。什么是最好的方式来做到这一点?

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

回答

0

有一个迂回(和非常hackish)的方式来做到这一点。如果您不介意解除归一化,您可以将一个可选的latest_entry字段添加到Blog模型中。然后,每次创建一个Entry实例时,您都可以覆盖Entry.save()以更新此字段的相应Blog实例。或者,你可以添加一个信号来做到这一点。

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

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

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] 

类似的东西。

+0

这将是理想的方式做到这一点,但不幸的是(除非我大错特错),这将产生更多的查询比也有博客(一个让每个博客的最新条目)。我想也许有一些更聪明的方法,但我开始相信没有。 – 2010-08-07 04:10:47

+0

在这里4年后,我开始同意你的说法@DenizDogan – boatcoder 2014-06-23 02:36:55