1. filter
方法
filter
是 Django ORM 中最常用的查询方法之一。它用来根据给定的条件过滤查询集并返回满足条件的对象。
articles = Article.objects.all()
# 使用 SearchFilter 进行搜索
search_param = request.query_params.get('search', None)
author_id = request.query_params.get('author_id', None)
# 模糊搜索
if search_param:
articles = articles.filter(title__icontains=search_param)
#精确搜索id
if author_id:
rticles = articles.filter(author_id=author_id) # 按作者 ID 精确搜索
如果你有多个条件,也可以使用 filter
进行连接:
articles = Article.objects.filter(
title__icontains='Django',
content__icontains='Python'
)
这会返回标题包含 "Django" 且内容包含 "Python" 的所有文章。
特点:
filter
会返回满足所有给定条件的结果。它相当于执行 SQL 查询中的WHERE
子句。- 它会隐式使用
AND
逻辑来连接多个条件。
2. Q
对象
Q
对象是 Django 中用于创建复杂查询条件的工具。它允许你在查询中使用 OR
或 AND
逻辑,甚至可以动态地构建查询条件。Q
对象特别适用于需要使用 OR
逻辑或条件组合的场景。
from django.db.models import Q
articles = Article.objects.filter(
Q(title__icontains='Django') |
Q(description__icontains='Django') |
Q(content__icontains='Django')
)
使用场景:
Q
适用于复杂查询,尤其是在需要使用OR
或动态组合查询条件时。- 使用
Q
对象可以灵活地组合不同的查询条件,可以使用&
表示AND
逻辑,使用|
表示OR
逻辑。
filter
用于常见的、简单的过滤条件,适用于大部分常规查询,默认使用AND
逻辑。Q
对象用于构建更复杂的查询,特别是当你需要灵活的OR
逻辑或者动态生成查询时。
articles = Article.objects.all()
# 使用 SearchFilter 进行搜索
search_param = request.query_params.get('search', None)
author_id = request.query_params.get('author_id', None)
# # 模糊搜索
# if search_param:
# articles = articles.filter(title__icontains=search_param)
# #精确搜索id
# if author_id:
# articles = articles.filter(author_id=author_id) # 按作者 ID 精确搜索
# 使用 Q 对象进行复杂查询
query = Q()
if search_param:
query &= (Q(title__icontains=search_param) | Q(content__icontains=search_param))
if author_id:
query &= Q(author_id=author_id)
# 应用查询条件
articles = articles.filter(query)