在 Django 中,条件筛选查询是指通过使用数据库查询语言来从数据库中检索特定条件的数据。Django 提供了 QuerySet API 来实现条件筛选查询,QuerySet 是一个代表数据库中一组对象的对象集合。通过在 QuerySet 上链式调用方法,您可以构建复杂的条件查询。
假设我们有一个简单的模型 Book
,它包含以下字段:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publication_year = models.IntegerField()
is_available = models.BooleanField(default=True)
我们将使用此模型来演示条件筛选查询的不同方式。
基本条件查询
最简单的条件查询是使用 filter()
方法。它会返回满足指定条件的所有对象。
# 导入模型
from myapp.models import Book
# 获取所有可用的书籍
available_books = Book.objects.filter(is_available=True)
# 获取特定作者的书籍
specific_author_books = Book.objects.filter(author="John Doe")
# 获取特定年份出版的书籍
specific_year_books = Book.objects.filter(publication_year=2022)
多条件查询
您可以将多个条件组合在一起使用。默认情况下,多个条件是“与”关系。
# 获取特定作者的特定年份可用的书籍
specific_author_and_year_books = Book.objects.filter(author="John Doe", publication_year=2022)
# 获取特定作者的可用书籍或特定年份的书籍
specific_author_or_year_books = Book.objects.filter(models.Q(author="John Doe") | models.Q(publication_year=2022))
# 获取特定作者的特定年份以外的书籍
specific_author_and_not_year_books = Book.objects.filter(models.Q(author="John Doe") & ~models.Q(publication_year=2022))
进一步筛选
您可以使用更多的方法来进一步筛选结果。例如,exclude()
方法排除满足指定条件的对象,get()
方法返回单个对象而不是 QuerySet 等等。
# 排除特定作者的书籍
non_specific_author_books = Book.objects.exclude(author="John Doe")
# 获取特定标题的单个书籍
specific_book = Book.objects.get(title="The Great Gatsby")
模糊查询
使用 icontains
进行模糊查询。
# 获取标题中包含关键字的书籍
keyword = "Python"
books_with_keyword = Book.objects.filter(title__icontains=keyword)