0

如果我有两节课:

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')

但我不能让它工作。

4

2 回答 2

2

模型.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',)

视图.py

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

    [.........]

模板

{% for group in groups %}
    {{group}} - {{group.latest_published}}<br/>
{% endfor %}
于 2013-03-19T16:43:58.617 回答
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. 从每个组中挑选第一个项目,并将它们放入一个列表中。
于 2016-10-17T03:56:10.133 回答