有效选择不同类别的最新项目

时间:2012-11-18 14:05:06

标签: django performance django-queryset

考虑以下模型:

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

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

关注this question,我正在选择不同的类别,然后针对每个类别进行单独查询:

    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个用于不同的类别,然后是每个类别的单独查询)。

有没有办法通过单个查询执行此操作?

1 个答案:

答案 0 :(得分:0)

通常,您将在关系数据库中使用group by。 Django有一个aggergation 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子句中的所有字段进行分组,并且您无法从查询中返回额外的列。

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

相关问题