如何在django中为每个相关对象选择一个对象?

如何在django中为每个相关对象选择一个对象?,django,django-queryset,Django,Django Queryset,如果我有两门课: class Group(models.Model): name = models.CharField(...) class Item(models.Model): group = models.ForeignKey(Group) published = models.DateTimeField(auto_now_add=True) def myview(request): groups = Group.objects.filter()

如果我有两门课:

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

class Item(models.Model):
    group = models.ForeignKey(Group)
    published = models.DateTimeField(auto_now_add=True)
def myview(request):
    groups = Group.objects.filter()

    [.........]
如何进行查询集以从每个组中选择最新发布的项目?我想应该是这样的

Item.objects.order_by('published').distinct('group')
def myview(request):
    groups = Group.objects.filter()

    [.........]

但是我不能让它工作。

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',)
def myview(request):
    groups = Group.objects.filter()

    [.........]
视图.py

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

    [.........]
模板

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

    [.........]
{% for group in groups %}
    {{group}} - {{group.latest_published}}<br/>
{% endfor %}
{%用于组中的组%}
{{group}}-{{group.latest_published}}
{%endfor%}
如果您不介意将所有项目从数据库加载到内存中,并且希望在单个查询中完成此操作,则可以执行此操作。在我的场景中,大约有8个“项目”和4个“组”,所以这样做几乎不算是一个性能上的成功

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

    [.........]
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)]
添加
。如果希望能够访问组对象,请在内部查询集中选择\u related('group')

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

    [.........]
它在做什么?

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

    [.........]
  • 查询设置以获取所有项目
  • 按项目组对项目进行分组
  • 从每组中挑选第一个项目,并将其放入列表中

  • 对不起,我不明白。我以为Item.objects.filter(group=self)[:1]只会返回一个对象?@ersran9,问题是
    如何进行查询设置以从每个组中选择最新发布的项目?
    。此查询
    Item.objects.filter(group=self)[:1]
    返回每个groupWell中最新发布的项目(一个项目)。那么,您的代码不也返回一个项目吗?由于在循环中
    返回
    。@ersran9每组一项,这就是要求