2010-08-06 107 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