考虑以下模型:
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个用于不同的类别,然后是每个类别的单独查询)。
有没有办法通过单个查询执行此操作?
答案 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()子句,但这不会在结果集中添加额外的列。