如何选择在Django每各相关对象的一个​​对象?(How can I select one obj

2019-10-29 12:47发布

如果我有两类:

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

但我不能使它发挥作用。

Answer 1:

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 %}


Answer 2:

如果你不介意加载所有项目的进入从数据库中存储,并且要做到这一点在一个单一的查询,那么你就可以做到这一点。 在我之情况,大约有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')如果你希望能够访问该组对象内查询集。

它正在做什么?

  1. 查询集来获取所有项目
  2. 分组通过他们的小组项目
  3. 从每组挑选第一个项目,并把它们放入一个列表。


文章来源: How can I select one object per each related object in django?