如何为django中的每个相关对象选择一个对象?
问题描述:
如果我有两类:如何为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')
但我不能让它的工作。
答
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 %}
答
如果你不介意的负荷将所有项目从数据库存储到内存中,并且您希望在单个查询中执行此操作,那么您可以执行此操作。在我的场景中,大约有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')
到内部查询集,如果你希望能够访问该组对象。
它在做什么?
- 查询集由他们的小组
- 采摘从每个组中的第一项,并把它们放入一个列表来获取所有项目
- 分组的项目。
对不起,我不明白。我认为Item.objects.filter(group = self)[:1]将只返回一个对象? – ersran9 2013-03-20 10:34:05
@ ersran9从问题'我怎样才能让QuerySet从每个组中选择最新发布的项目?'。这个查询Item.objects.filter(group = self)[:1]'返回每个组中最近发布的项目(一个项目) – catherine 2013-03-20 10:38:18
嗯,你的代码是不是也返回单个项目呢?因为你在循环内返回。 – ersran9 2013-03-20 10:55:34