如果我有两类:
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 %}
如果你不介意加载所有项目的进入从数据库中存储,并且要做到这一点在一个单一的查询,那么你就可以做到这一点。 在我之情况,大约有800“项目”和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')
如果你希望能够访问该组对象内查询集。
它正在做什么?
- 查询集来获取所有项目
- 分组通过他们的小组项目
- 从每组挑选第一个项目,并把它们放入一个列表。