Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 高效地选择不同类别的最新项目_Django_Performance_Django Queryset - Fatal编程技术网

Django 高效地选择不同类别的最新项目

Django 高效地选择不同类别的最新项目,django,performance,django-queryset,Django,Performance,Django Queryset,考虑以下模型: class Data(Model): created_at = models.DateTimeField() category = models.CharField(max_length=7) 我想为所有类别选择最新的对象 接下来,我将选择不同的类别,然后对每个类别进行单独的查询: categories = Data.objects.distinct('category').values_list('category', flat

考虑以下模型:

    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')
这种方法的缺点是,它对不同的类别进行大量查询,然后对每个类别进行单独查询


有没有一种方法可以通过单个查询实现这一点?

通常,您会在关系数据库中使用GROUPBY。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子句,但这不会在结果集中添加额外的列。

如果您不打算使用单独的类别模型,则最好将Data.objects.all分配给一个变量,并运行函数检索每个类别的最新数据,这只是使用单独的类别模型缩短当前代码的一个查询:latest_objects=[obj.data_set.latest for object in Category.objects.all if obj.data_set.count]