0

2 つのクラスがある場合:

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

class Item(models.Model):
    group = models.ForeignKey(Group)
    published = models.DateTimeField(auto_now_add=True)

各グループから最新の公開アイテムを選択するクエリセットを作成するにはどうすればよいですか? 私はそれが次のようなものであるべきだと思います

Item.objects.order_by('published').distinct('group')

しかし、私はそれを機能させることはできません。

4

2 に答える 2

2

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

ビュー.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 に答える