跳至主要內容

Q 和 F 对象

Entity大约 2 分钟

Q 和 F 对象

在 Tortoise ORM 中,QF 对象用于构建复杂查询,类似于 Django ORM。


1. Q 对象

Q 对象用于组合多个查询条件,支持 AND(&)、OR(|)、NOT(~) 操作符。
它用于 动态构建查询,特别是在有可选过滤条件的情况下。

示例:Q 对象的使用

from tortoise.expressions import Q
from models import Book

# 查询 name="Python" 或 price 大于 50 的书籍
books = await Book.filter(Q(name="Python") | Q(price__gt=50))

# 查询 name="Python" 且 price 小于 100 的书籍
books = await Book.filter(Q(name="Python") & Q(price__lt=100))

# 查询 price 不等于 50 的书籍
books = await Book.filter(~Q(price=50))

🔹 作用

  • 允许 OR 条件(普通 .filter(name="Python", price__gt=50) 是 AND 关系)
  • 允许 动态构建查询(可以根据条件是否存在来构造 Q 对象)

2. F 对象

F 对象用于引用数据库中的字段,主要用于字段间的比较或更新

示例:F 对象的使用

from tortoise.expressions import F
from models import Book

# 查询 price 大于 pages 数量的书籍
books = await Book.filter(price__gt=F("pages"))

# 将所有书籍的 price 提高 10
await Book.filter().update(price=F("price") + 10)

# 将 price 设为 pages 的 2 倍
await Book.filter().update(price=F("pages") * 2)

🔹 作用

  • 允许字段之间的比较(如 price > pages
  • 允许数据库内的字段更新(如 price = price + 10
  • 避免查询后再更新,提升数据库性能(直接在 SQL 层执行)

3. Q + F 组合使用

# 查询 price 大于 pages 并且 name 以 "Python" 开头的书籍
books = await Book.filter(Q(price__gt=F("pages")) & Q(name__startswith="Python"))

总结

对象作用示例
Q构造复杂查询(支持 &、`~`)
F引用字段(用于字段间比较或更新)Book.filter(price__gt=F("pages"))

什么时候用?

  • Q:用于 动态构建查询,比如用户可选多个筛选条件时。
  • F:用于 字段计算,比如 批量更新 时直接在数据库操作,提升性能。

你是要用 QF 来优化什么查询吗?😊