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