Django ORM – 多表实例(聚合与分组查询)


Django ORM是一个强大的对象关系映射器,它支持许多高级查询和操作。这篇文章将着重介绍Django ORM多表实例中的聚合和分组查询。

聚合查询

聚合查询是指将多个值合并成一个结果,例如取平均值、总和、计数或最大/最小值。在Django ORM中,可以用Aggregation来实现聚合查询。

下面是一个例子,我们将计算所有Order中的total金额之和,并返回该值:

from django.db.models import Sum
total = Order.objects.aggregate(Sum('total'))['total__sum']

这个查询使用了Sum聚合操作,它将根据传入的参数计算所有Order对象的total值之和。aggregate()函数返回一个字典,包含计算结果和查询字段名称。

我们也可以使用Count、Avg、Max和Min等多种聚合操作,示例如下:

from django.db.models import Avg, Count, Max, Min
num_orders = Order.objects.aggregate(Count('id'))['id__count']
avg_total = Order.objects.aggregate(Avg('total'))['total__avg']
max_total = Order.objects.aggregate(Max('total'))['total__max']
min_total = Order.objects.aggregate(Min('total'))['total__min']

分组查询

分组查询是指将查询结果按照某个字段进行分组,可以将结果分成有序的组。在Django ORM中,可以使用annotate()和values()实现分组查询。

假设我们有一个Order模型,其中包含一个字段country表示订单所属国家。下面的代码段将返回每个国家的订单数:

from django.db.models import Count
orders_by_country = Order.objects.values('country').annotate(num_orders=Count('id')).order_by('-num_orders')

这段代码首先使用values()方法来指定按国家分组,然后使用annotate()方法来计算每个组的数量。Order.objects.values(‘country’)表示只返回国家列,并根据国家列分组。

在最后一行,我们使用了order_by()方法来按订单数降序排列结果。结果将具有一个“country”列和一个“num_orders”列,分别表示国家和该国家的订单数。

总结

聚合和分组查询是Django ORM中强大的查询操作之一。聚合查询可以帮助我们计算数据的总和、平均值或其他数据,而分组查询可以按照指定的条件分组,使我们更容易理解和分析数据。它们可以用于各种情况,例如报告生成、数据挖掘和其他高级分析。