使用 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