Tortoise ORM 条件查询语法
在 Tortoise ORM 中,你可以使用filter()
方法来基于多个条件组合查询数据列表。
Tortoise ORM 提供了丰富的查询语法,包括AND
、OR
、NOT
条件的组合。
1. 按多个条件查询(AND)
使用多个条件组合查询时,默认是AND
条件,即所有条件都必须满足。
from models import User
async def get_users_by_username_and_email(username: str, email: str):
users = await User.filter(username=username, email=email).all()
return users
2. 使用 OR 条件查询
要使用OR
条件组合查询,可以使用Q
对象,并结合|
运算符。
from models import User
from tortoise.expressions import Q
async def get_users_by_username_or_email(username: str, email: str):
users = await User.filter(Q(username=username) | Q(email=email)).all()
return users
3. 使用 NOT 条件查询
要使用NOT
条件,你可以结合Q
对象和~
运算符。
async def get_users_not_with_username(username: str):
users = await User.filter(~Q(username=username)).all()
return users
4. 组合 AND OR NOT 条件
注意优先级,用小括号做隔离。
async def get_users_complex_query(username: str, email: str):
users = await User.filter(
(Q(username=username) & ~Q(email=email) | Q(email__contains="example.com")
).all()
return users
5. 条件表达式
Tortoise ORM 提供了多种条件表达式,用于在查询时指定复杂的过滤条件。
例如,如下代码用到了字段的表达式:
from models import User
from tortoise.expression import Q
async def filter_users():
users = await User.filter(
Q(username__icontains="admin") |
Q(email__endswith="@example.com") &
Q(age_gte=18)
).all()
return users
6. 常见表达式大全
# 1、精确匹配
filedname = value
email = "test@example.com"
# 2、不等于(not),无法直接使用 != 这种运算符来表达”不等于“的条件
fieldname__not=value
username__not="admin"
# 3、大小比较(gt,gte,lt,lte)
age__gt=18 # 大于18
age__gte=18 # 大于等于18
age__lt=18 # 小于 18
age__lte=18 # 小于等于18
# 4、包含子字符串(contains,icontains)
email__contains="@example.com" # 区分大小写
email__icontains="@example.com" # 不区分大小写
# 5、以 ... 开头(startswith,istartswith)
username__startswith="admin" # 以 admin 开头
username__istartswith="ADMIN" # 不区分大小写
# 6、以 ... 结尾(endswith,iendswith)
email__endswith="@example.com" # 区分大小写
email__iendswith="@EXAMPLE.COM" # 不区分大小写
# 7、字段为空(isnull)
filedname__isnull=True
last_login__isnull=True
# 8、在列表中(in)
filedname__in=[value1, value2, ...]
id__in=[1, 2, 3]
# 9、正则表达式(regex,iregex)
username__regex=r"^[a-zA-Z0-9_]+$" # 区分大小写
username__iregex=r"^[a-z0-9_]+$" # 不区分大小写
# 10、日期相关(year、month、day、week、week_day、hour、minute、second)
# 用于日期时间字段,匹配特定的年份、月份、日期等
created_at__year=2023 # 匹配 2023 年的记录
created_at__month=8 # 匹配 8 月份的记录