2013-03-19 59 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. 分组的项目。
相关问题