Tortoise ORM 条件查询语法

Tortoise ORM 条件查询语法

在 Tortoise ORM 中,你可以使用filter()方法来基于多个条件组合查询数据列表。
Tortoise ORM 提供了丰富的查询语法,包括ANDORNOT条件的组合。

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 月份的记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值