1. 什么是Django ORM filter()
Django 是一个流行的 Web 开发框架,ORM(对象关系映射)是 Django 中最有用的功能之一。ORM 允许开发人员将 Python 代码转换成恰当的数据库语句。使用 Django ORM,我们可以将查询代码写成 Python 查询代码。本文将重点介绍 Django ORM 中的 filter() 函数。
2. filter() 方法是什么
filter() 是 Django ORM 中用于过滤 QuerySet 的方法。它可以帮助我们根据特定条件从数据库中获取数据。该方法可以被调用多次来过滤 QuerySet。如下是 filter() 函数的基本语法:
Model.objects.filter(条件)
其中,Model 是你正在查询的模型;objects 是 Django ORM 中 QuerySet 的管理器,它允许我们以多种方式与模型进行交互。filter() 方法返回与提供条件匹配的对象 QuerySet 列表。
3. filter() 方法示例
3.1 获取所有包含“Django”的书籍
Book.objects.filter(title__contains='Django')
上述代码将返回所有标题包含“Django”字符的 Book 对象列表。在 filter() 方法中,title__contains='Django' 用于匹配所有标题包含 Django 的 Book 对象。__contains 是一个 Django ORM 特殊的查询运算符,用于搜索一个文本字段中包含特定文本的所有行。
3.2 获取所有价格小于 100 元的书籍
Book.objects.filter(price__lt=100)
上述代码将返回所有价格小于 100 的 Book 对象列表。在 filter() 方法中,price__lt=100 用于匹配所有价格小于 100 元的 Book 对象。__lt 是一个 Django ORM 的特殊查询运算符,被用于搜索价格低于指定值的所有行。
3.3 获取所有价格低于 100,并且作者是“John Doe”的书籍
Book.objects.filter(price__lt=100, author__name='John Doe')
上述代码将返回所有价格低于 100 元,并且作者名为“John Doe”的书籍对象列表。在 filter() 方法中,price__lt=100 用于匹配所有价格低于 100 元的 Book 对象;author__name='John Doe' 用于匹配所有作者名为“John Doe”的 Book 对象。多个查询条件可以分别通过逗号隔开,实现多条件查询。
3.4 获取当前用户发布的所有文章
假设我们有一个名为 Article 的模型,它包括 author、title 以及 text 等属性。如果我们想要获取当前用户已发布的所有文章,我们可以利用 Django 的 auth 应用程序中的 User 模型,使用 filter() 方法来实现:
from django.contrib.auth.decorators import login_required
@login_required
def user_articles(request):
articles = Article.objects.filter(author=request.user)
return render(request, 'article_list.html', {'articles': articles})
上述代码会返回 author 属性值等于当前用户的所有 Article 对象组成的 QuerySet 列表。我们首先从 Django auth 应用程序中导入 django.contrib.auth.decorators.login_required 装饰器,它将确保只有已登录的用户能够访问该页面。然后,我们使用 filter() 方法来获取当前用户发布的所有文章。
3.5 获取符合多个查询条件的对象
我们可以使用多个 filter() 方法来获取符合多个查询条件的对象:
Book.objects.filter(price__lt=100).filter(author__name='John Doe')
上述代码将返回所有满足以下两个条件的 Book 对象:价格小于 100 元,并且作者名为“John Doe”。
4. filter() 方法支持的运算符
除了 __contains 和 __lt 运算符之外,filter() 方法还支持多种其他运算符。以下是一些运算符:
exact:精确等于某个值,区分大小写。
iexact:与 exact 相似,但是大小写不敏感。
icontains:模糊匹配,大小写不敏感。
gt:大于某个值。
gte:大于或等于某个值。
lt:小于某个值。
lte:小于或等于某个值。
startswith:以某个值开头。
endswith:以某个值结束。
5. 总结
在 Django ORM 中,filter() 方法是一个非常有用的函数,它用于从数据库中查询符合一定条件的对象列表。通过使用特殊的查询运算符,我们可以限制返回的结果。例如,通过使用 __contains 运算符,我们可以搜索文本字段中包含指定文本的所有行。此外,我们还可以使用多个 filter() 方法来实现多条件查询。在实际开发中,filter() 方法几乎用于所有的查询操作。