2

考虑以下模型:

    class Data(Model):
        created_at = models.DateTimeField()
        category = models.CharField(max_length=7)

我想为所有类别选择最新的对象。

这个问题之后,我选择了不同的类别,然后对它们中的每一个进行单独的查询:

    categories = Data.objects.distinct('category').values_list('category', flat=True)
    for category in categories:
        latest_obj = Data.objects.filter(category=category).latest('created_at')

该方法的缺点是它会进行大量查询(1 个用于不同类别,然后每个类别单独查询)。

有没有办法用一个查询来做到这一点?

4

1 回答 1

0

通常,您会在关系数据库中使用 group by。Django 有一个聚合 API (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregation),它允许您执行以下操作:

from django.db.models import Max
Data.objects.values('category').annotate(latest=Max('created_at'))

这将执行单个查询并返回如下列表:

[{'category' : 'cat1', 'latest' : '01/01/01' },{'category' : 'cat2' 'latest' : '02/02/02' }]

但我想您可能还想在此列表中检索数据记录 ID。在这种情况下,Django 不会让你觉得简单。问题是 django 使用 value 子句中的所有字段进行分组,并且您不能从查询中返回额外的列。

编辑:我最初建议在基于 Web 资源的查询末尾添加第二个 values() 子句,但这不会在结果集中添加额外的列。

于 2012-11-18T15:05:17.010 回答