在 Django ORM 中,聚合查询是一种用于对数据库中的数据进行统计和计算的强大工具。通过聚合查询,你可以执行例如求和、平均值、计数等的操作。以下是一些基本的聚合查询的示例:

使用 aggregate 进行聚合查询

假设我们有一个 Book 模型,它包含了书籍的价格信息:
# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=10, decimal_places=2)

计算书籍的平均价格:
from django.db.models import Avg

average_price = Book.objects.aggregate(avg_price=Avg('price'))
print(average_price)
# 输出:{'avg_price': 34.5}

计算书籍的总价格:
from django.db.models import Sum

total_price = Book.objects.aggregate(total_price=Sum('price'))
print(total_price)
# 输出:{'total_price': Decimal('138.00')}

计算书籍的最高价格:
from django.db.models import Max

max_price = Book.objects.aggregate(max_price=Max('price'))
print(max_price)
# 输出:{'max_price': Decimal('50.00')}

使用 annotate 进行分组聚合查询

假设我们有一个 Order 模型,它包含了订单的信息,每个订单可以包含多个书籍:
# models.py
from django.db import models

class Order(models.Model):
    order_number = models.CharField(max_length=10)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    quantity = models.IntegerField()

计算每个订单的总价格:
from django.db.models import Sum

order_total_prices = Order.objects.annotate(total_price=Sum('orderitem__book__price'))
for order in order_total_prices:
    print(f"Order {order.order_number} total price: {order.total_price}")

在这个例子中,annotate 方法允许我们对每个订单计算总价格,通过访问关联的 OrderItem 和 Book 模型的价格字段。

这只是 Django ORM 中聚合查询的一些基本示例。实际上,你可以使用多种聚合函数和组合它们以满足你的需求。深入了解 Django ORM 的聚合查询可以让你更灵活地处理数据库中的数据。


转载请注明出处:http://www.zyzy.cn/article/detail/13919/Django