📅  最后修改于: 2023-12-03 15:11:05.640000             🧑  作者: Mango
在 Django 中,我们使用 QuerySet 来进行数据库查询和操作。QuerySet 是一个查询集合,它允许我们在数据库中执行多种操作,例如过滤数据、排序、限制结果集以及聚合数据等。
首先,我们需要在 Django 中定义一个模型来映射到数据库表中。下面是一个简单的示例模型定义:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
price = models.DecimalField(max_digits=7, decimal_places=2)
published_date = models.DateField()
上述代码定义了一个名为 Book 的模型,它有四个属性:title、author、price 和 published_date。其中,title 和 author 是字符串类型,price 是一个十进制数(存储 7 位数字和 2 位小数),published_date 是一个日期类型。
要在数据库中创建这个表,我们需要运行下面的命令:
python manage.py makemigrations
python manage.py migrate
接下来,我们可以使用这个模型来创建 QuerySet,例如:
from myapp.models import Book
# 获取所有 Book 对象
qs = Book.objects.all()
# 根据价格过滤 Book 对象
qs = Book.objects.filter(price__gt=10)
上述代码中,Book.objects
是一个 QuerySet 对象。.all()
方法返回所有 Book 对象,.filter()
方法根据条件过滤 Book 对象。price__gt=10
表示价格大于 10 的 Book 对象。
我们可以像操作列表一样来遍历和操作 QuerySet,例如:
for book in qs:
print(book.title)
我们也可以使用查询操作符(例如 count()
、first()
、last()
、exists()
等)来查询结果,例如:
# 获取总数
count = qs.count()
# 获取第一个对象
book = qs.first()
# 获取最后一个对象
book = qs.last()
# 判断是否存在对象
exists = qs.exists()
注意,这些查询操作符不会返回 QuerySet,它们返回的是实际的对象或值。
我们可以使用链式调用来进行多个查询条件的组合,例如:
# 获取价格大于 10 并且出版日期早于 2020 年的 Book 对象
qs = Book.objects.filter(price__gt=10, published_date__lt='2020-01-01')
上述代码中,.filter()
方法可以接受多个查询条件,并使用逗号(,
)来分隔它们。在上例中,我们使用了价格大于 10 和出版日期早于 2020 年这两个条件来筛选结果。
除了基本的查询,我们还可以使用聚合操作来对查询结果进行统计或计算。例如:
from django.db.models import Sum, Avg, Max, Min
# 获取价格总和
total_price = qs.aggregate(Sum('price'))['price__sum']
# 获取平均价格
avg_price = qs.aggregate(Avg('price'))['price__avg']
# 获取最高价格
max_price = qs.aggregate(Max('price'))['price__max']
# 获取最低价格
min_price = qs.aggregate(Min('price'))['price__min']
上述代码中,aggregate()
方法用于聚合操作。Sum()
、Avg()
、Max()
和 Min()
分别表示求和、平均、最大和最小操作。
在 Django 中,QuerySet 是一个十分强大的工具,它可以用于多种数据库查询和操作。从简单的过滤、排序和限制结果集,到复杂的聚合和查询组合,QuerySet 可以帮助我们完成许多常见的数据库操作。了解 QuerySet 的用法可以让我们更加高效地使用 Django 来构建 Web 应用程序。