跳到主要内容

Django 模型查询

介绍

在Django中,模型是与数据库交互的核心。通过模型查询,我们可以从数据库中检索、过滤、排序和聚合数据。Django的ORM(对象关系映射)使得这些操作变得简单且直观,无需编写复杂的SQL语句。本文将带你逐步了解Django模型查询的基本概念和实际应用。

基本查询

获取所有对象

要从数据库中获取某个模型的所有对象,可以使用 all() 方法。例如,假设我们有一个 Book 模型:

python
from myapp.models import Book

# 获取所有书籍
books = Book.objects.all()

books 将是一个包含所有 Book 对象的查询集(QuerySet)。

获取单个对象

如果你知道某个对象的唯一标识符(通常是主键),可以使用 get() 方法:

python
# 获取主键为1的书籍
book = Book.objects.get(id=1)
警告

如果查询结果为空或返回多个对象,get() 方法会抛出异常。因此,确保查询条件唯一。

过滤查询

使用 filter() 方法

filter() 方法允许你根据条件过滤查询集。例如,获取所有价格低于20的书籍:

python
# 获取价格低于20的书籍
cheap_books = Book.objects.filter(price__lt=20)

使用 exclude() 方法

exclude() 方法与 filter() 相反,它会排除符合条件的对象。例如,排除所有价格高于50的书籍:

python
# 排除价格高于50的书籍
affordable_books = Book.objects.exclude(price__gt=50)

链式查询

你可以将多个查询方法链式调用,以进一步细化查询结果。例如,获取价格低于20且作者为“John Doe”的书籍:

python
# 获取价格低于20且作者为“John Doe”的书籍
specific_books = Book.objects.filter(price__lt=20).filter(author="John Doe")

排序查询

使用 order_by() 方法

order_by() 方法允许你对查询结果进行排序。例如,按价格升序排列书籍:

python
# 按价格升序排列书籍
books_ordered_by_price = Book.objects.all().order_by('price')

你也可以按多个字段排序,例如先按作者排序,再按价格排序:

python
# 先按作者排序,再按价格排序
books_ordered_by_author_and_price = Book.objects.all().order_by('author', 'price')
提示

在字段名前加上 - 可以按降序排列,例如 order_by('-price')

聚合查询

使用 aggregate() 方法

aggregate() 方法允许你对查询集进行聚合操作,例如计算平均值、总和等。例如,计算所有书籍的平均价格:

python
from django.db.models import Avg

# 计算所有书籍的平均价格
average_price = Book.objects.aggregate(Avg('price'))

使用 annotate() 方法

annotate() 方法允许你为查询集中的每个对象添加聚合值。例如,为每本书添加一个字段,表示其价格是否高于平均价格:

python
from django.db.models import Avg, Case, When, Value, BooleanField

# 计算平均价格
average_price = Book.objects.aggregate(Avg('price'))['price__avg']

# 为每本书添加一个字段,表示其价格是否高于平均价格
books_with_avg = Book.objects.annotate(
is_expensive=Case(
When(price__gt=average_price, then=Value(True)),
default=Value(False)),
output_field=BooleanField(),
)
)

实际案例

假设我们有一个在线书店,需要实现以下功能:

  1. 显示所有价格低于30的书籍。
  2. 显示所有作者为“Jane Austen”的书籍,并按出版日期降序排列。
  3. 计算所有书籍的总价格。
python
# 1. 显示所有价格低于30的书籍
cheap_books = Book.objects.filter(price__lt=30)

# 2. 显示所有作者为“Jane Austen”的书籍,并按出版日期降序排列
jane_austen_books = Book.objects.filter(author="Jane Austen").order_by('-publication_date')

# 3. 计算所有书籍的总价格
from django.db.models import Sum
total_price = Book.objects.aggregate(Sum('price'))['price__sum']

总结

通过本文,你已经学习了如何使用Django模型查询与数据库交互。我们介绍了基本查询、过滤、排序和聚合操作,并通过实际案例展示了这些概念的应用。Django的ORM使得数据库操作变得简单且直观,无需编写复杂的SQL语句。

附加资源与练习

  • 练习1:创建一个 Author 模型,并编写查询,获取所有作者及其书籍的平均价格。
  • 练习2:使用 annotate() 方法为每本书添加一个字段,表示其价格是否高于某个阈值。
  • 官方文档Django QuerySet API Reference

继续练习并探索Django的更多功能,你将能够构建强大的数据库驱动的应用程序!