函数和聚合¶
要在值上应用函数并在数据库端计算聚合,需要注释 QuerySet。
results = await SomeModel.filter(...).annotate(clean_desc=Coalesce("desc", "N/A"))
这将在每个 SomeModel
实例上添加一个名为 clean_desc
的新属性,该属性现在将包含注释的数据。
还可以调用 .values()
或 .values_list()
来获取数据,就像常规一样。
函数¶
函数对字段的每个实例应用转换。
- 类 tortoise.functions.连接(字段, *默认值)[源代码]¶
连接字段或常量文本。注意,像 sqlite3 这样的数据库不支持 CONCAT。
Concat("字段名称", 其他字段名称 或 常量文本, *args)
聚合¶
聚合应用于整个列,通常与分组一起使用。因此,通常与 .first()
QuerySet 结合使用。
-
类 tortoise.functions.Sum(field, *default_values, distinct=
False
, _filter=None
)[源代码]¶ 累加该列的所有值。
Sum("字段名称")
-
类 tortoise.functions.Max(field, *default_values, distinct=
False
, _filter=None
)[源代码]¶ 返回该列中的最大值。
Max("字段名称")
-
类 tortoise.functions.Min(field, *default_values, distinct=
False
, _filter=None
)[源代码]¶ 返回该列中的最小值。
Min("字段名称")
基本函数类¶
- 类 tortoise.functions.Function(字段, *默认值)[源代码]¶
函数/聚合基本信息。
- database_func pypika.terms.Function¶
它表示的 pypika 函数。
- populate_field_object bool = False¶
启用 populate_field_object,我们希望尝试保留字段类型。
-
class tortoise.functions.Aggregate(field, *default_values, distinct=
False
, _filter=None
)[source]¶ SQL 聚合的基础。
自定义函数¶
您可以定义非内置的自定义函数,例如 TruncMonth
和 JsonExtract
等。
from pypika import CustomFunction
from tortoise.expressions import F, Function
class TruncMonth(Function):
database_func = CustomFunction("DATE_FORMAT", ["name", "dt_format"])
sql = Task.all().annotate(date=TruncMonth('created_at', '%Y-%m-%d')).values('date').sql()
print(sql)
# SELECT DATE_FORMAT(`created_at`,'%Y-%m-%d') `date` FROM `task`
您还可以在更新中使用函数,该示例仅适用于 MySQL 和 SQLite,但 PostgreSQL 是相同的。
from tortoise.expressions import F
from pypika.terms import Function
class JsonSet(Function):
def __init__(self, field: F, expression: str, value: Any):
super().__init__("JSON_SET", field, expression, value)
json = await JSONFields.create(data_default={"a": 1})
json.data_default = JsonSet(F("data_default"), "$.a", 2)
await json.save()
# or use queryset.update()
sql = JSONFields.filter(pk=json.pk).update(data_default=JsonSet(F("data_default"), "$.a", 3)).sql()
print(sql)
# UPDATE jsonfields SET data_default=JSON_SET(`data_default`,'$.a',3) where id=1