2013-03-19 61 views
0

如果我有兩類:如何爲django中的每個相關對象選擇一個對象?

class Group(models.Model): 
    name = models.CharField(...) 

class Item(models.Model): 
    group = models.ForeignKey(Group) 
    published = models.DateTimeField(auto_now_add=True) 

我怎樣才能讓一個QuerySet選擇從每個組最新發布的項目?我想它應該是這樣的

Item.objects.order_by('published').distinct('group') 

但我不能讓它的工作。

回答

2

models.py

class Group(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.name 

    def latest_published(self): 
     items = Item.objects.filter(group=self)[:1] 
     for item in items: 
      return item.published 
     return '' 

class Item(models.Model): 
    group = models.ForeignKey(Group) 
    published = models.DateTimeField() 

    def __unicode__(self): 
     return "{0}".format(self.published) 

    class Meta: 
     ordering = ('-published',) 

views.py

def myview(request): 
    groups = Group.objects.filter() 

    [.........] 

模板

{% for group in groups %} 
    {{group}} - {{group.latest_published}}<br/> 
{% endfor %} 
+0

對不起,我不明白。我認爲Item.objects.filter(group = self)[:1]將只返回一個對象? – ersran9 2013-03-20 10:34:05

+0

@ ersran9從問題'我怎樣才能讓QuerySet從每個組中選擇最新發布的項目?'。這個查詢Item.objects.filter(group = self)[:1]'返回每個組中最近發佈的項目(一個項目) – catherine 2013-03-20 10:38:18

+0

嗯,你的代碼是不是也返回單個項目呢?因爲你在循環內返回。 – ersran9 2013-03-20 10:55:34

0

如果你不介意的負荷將所有項目從數據庫存儲到內存中,並且您希望在單個查詢中執行此操作,那麼您可以執行此操作。在我的場景中,大約有8個「項目」和大約4個「組」,所以這樣做幾乎沒有性能問題。

from itertools import groupby 

items = [list(g)[0] for k, g in groupby(Item.objects.all().order_by('group', '-published'), lambda x: x.group_id)] 

添加.select_related('group')到內部查詢集,如果你希望能夠訪問該組對象。

它在做什麼?

  1. 查詢集由他們的小組
  2. 採摘從每個組中的第一項,並把它們放入一個列表來獲取所有項目
  3. 分組的項目。
相關問題