字段¶
用法¶
字段被定义为 Model 类对象的属性
from tortoise.models import Model
from tortoise import fields
class Tournament(Model):
id = fields.IntField(primary_key=True)
name = fields.CharField(max_length=255)
参考¶
以下是可用字段的列表,其中包含这些字段的自定义选项
基本字段¶
-
class tortoise.fields.base.Field(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[source]¶ 基本字段类型。
- 参数:¶
- source_field=
None¶ 如果数据库列名称需要特定名称,而不是根据字段名称生成,则提供 source_field 名称。
- generated=
False¶ 此字段是否为数据库生成?
- primary_key=
None¶ 此字段是否是主键?模型上只能有一个这样的字段,如果没有指定,它将自动生成一个名为
id的默认主键。- null=
False¶ 此字段是否可为空?
- default=
None¶ 如果在创建模型时未指定,则为字段设置默认值。这也可以是动态默认值的调用,在这种情况下,我们将调用它。默认值不会成为模式的一部分。
- unique=
False¶ 此字段是否唯一?
- db_index=
None¶ 此字段是否应由自身索引?
- description=
None¶ 字段描述。还将显示在
Tortoise.describe_model()中,并作为生成的 DDL 中的 DB 注释。- validators=
None¶ 此字段的验证器。
- source_field=
类属性:定义实际字段类型时需要定义这些属性。
- field_type Type[Any]¶
字段的 Python 类型。如果添加类型作为 mixin,_FieldMeta 会自动将其设置为该类型。
- indexable bool = True¶
字段是否可索引?如果此字段无法可靠地索引,则设置为 False。
- has_db_field bool = True¶
此字段是否有直接对应的 DB 列?或者字段是否虚拟化?
- skip_to_python_if_native bool = False¶
如果 DB 驱动程序本机支持此 Python 类型,我们是否应该跳过它?这仅用于优化目的,我们不需要在 Python 和 DB 之间强制进行类型转换。
- allows_generated bool = False¶
此字段是否能够由 DB 生成?
- function_cast Optional[pypika.Term] = None¶
如果 DB 需要仿真帮助,我们需要应用的转换项。
- SQL_TYPE str¶
数据库将使用的 SQL 类型(字符串形式)。
- GENERATED_SQL str¶
指示数据库自动生成此字段的 SQL。如果
allows_generated为True,则此项为必填项。
按数据库进行覆盖
可以按数据库指定任何类属性或
to_db_value或to_python_value方法的覆盖。为此,请指定一个内部类,形式为
class _db__SQL_DIALECT:,如下所示class _db_sqlite: SQL_TYPE = "VARCHAR(40)" skip_to_python_if_native = False def function_cast(self, term: Term) -> Term: return functions.Cast(term, SqlTypes.NUMERIC)然后,Tortoise 将针对该方言使用覆盖的属性/函数。如果需要动态属性,可以使用属性。
- describe(serializable)[source]¶
描述字段。
- 参数:¶
- serializable¶
如果想要原始 Python 对象,则为
False,如果想要可 JSON 序列化的数据,则为True。(默认为True)
- 返回类型:¶
dict- 返回:¶
包含字段描述的字典。
(这假定
serializable=True,这是默认值){ "name": str # Field name "field_type": str # Field type "db_column": str # Name of DB column # Optional: Only for pk/data fields "raw_field": str # Name of raw field of the Foreign Key # Optional: Only for Foreign Keys "db_field_types": dict # DB Field types for default and DB overrides "python_type": str # Python type "generated": bool # Is the field generated by the DB? "nullable": bool # Is the column nullable? "unique": bool # Is the field unique? "indexed": bool # Is the field indexed? "default": ... # The default value (coerced to int/float/str/bool/null) "description": str # Description of the field (nullable) "docstring": str # Field docstring (nullable) }当指定
serializable=False时,某些字段不会强制转换为有效的 JSON 类型。更改如下{ "field_type": Field # The Field class used "python_type": Type # The actual Python type "default": ... # The default value as native type OR a callable }
- class tortoise.fields.base.OnDelete(value)[source]¶
枚举。
-
CASCADE =
'CASCADE'¶
-
NO_ACTION =
'NO ACTION'¶
-
RESTRICT =
'RESTRICT'¶
-
SET_DEFAULT =
'SET DEFAULT'¶
-
SET_NULL =
'SET NULL'¶
-
CASCADE =
数据字段¶
-
class tortoise.fields.data.BigIntField(primary_key=
None, **kwargs)[source]¶ 大整数字段。(64 位有符号整数)
primary_key(布尔值)如果字段是主键,则为 True。
-
类 tortoise.fields.data.BinaryField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶ 二进制字段。
用于存储
bytes对象。请注意,不支持过滤器或查询集更新操作。- field_type¶
bytes的别名
-
类 tortoise.fields.data.BooleanField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶ 布尔字段。
- field_type¶
bool的别名
-
tortoise.fields.data.CharEnumField(enum_type, description=
None, max_length=0, **kwargs)[源代码]¶ 字符枚举字段
表示字符枚举的字段。
警告:如果未指定
max_length或其等于零,则会自动检测表示的字符字段的大小。因此,如果你稍后更新枚举,则还需要更新表架构。注意:
enum_type的有效 str 值是可接受的。enum_type:枚举类
description:字段的描述。如果未指定为“名称:值”对的多行列表,则会自动设置。
max_length:创建的 CharField 的长度。如果为零,则会从 enum_type 自动检测。
- 返回类型:¶
枚举
- class tortoise.fields.data.CharField(max_length, **kwargs)[source]¶
字符字段。
你必须提供以下内容
max_length(int)字段的最大长度(以字符为单位)。
- field_type¶
str的别名
-
类 tortoise.fields.data.DateField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶ 日期字段。
- field_type¶
date的别名
-
类 tortoise.fields.data.DatetimeField(auto_now=
False, auto_now_add=False, **kwargs)[源代码]¶ Datetime 字段。
auto_now和auto_now_add是互斥的。你可以选择不设置或仅设置其中一个。auto_now(bool)始终在保存时设置为
datetime.utcnow()。auto_now_add(bool)仅在首次保存时设置为
datetime.utcnow()。
- describe(serializable)[source]¶
描述字段。
- 参数:¶
- serializable¶
如果想要原始 Python 对象,则为
False,如果想要可 JSON 序列化的数据,则为True。(默认为True)
- 返回类型:¶
dict- 返回:¶
包含字段描述的字典。
(这假定
serializable=True,这是默认值){ "name": str # Field name "field_type": str # Field type "db_column": str # Name of DB column # Optional: Only for pk/data fields "raw_field": str # Name of raw field of the Foreign Key # Optional: Only for Foreign Keys "db_field_types": dict # DB Field types for default and DB overrides "python_type": str # Python type "generated": bool # Is the field generated by the DB? "nullable": bool # Is the column nullable? "unique": bool # Is the field unique? "indexed": bool # Is the field indexed? "default": ... # The default value (coerced to int/float/str/bool/null) "description": str # Description of the field (nullable) "docstring": str # Field docstring (nullable) }当指定
serializable=False时,某些字段不会强制转换为有效的 JSON 类型。更改如下{ "field_type": Field # The Field class used "python_type": Type # The actual Python type "default": ... # The default value as native type OR a callable }
- field_type¶
datetime的别名
- class tortoise.fields.data.DecimalField(max_digits, decimal_places, **kwargs)[source]¶
精确的小数字段。
你必须提供以下内容
max_digits(int)小数字段的有效数字的最大位数。
decimal_places(int)小数点后有效数字的位数。
- field_type¶
Decimal的别名
-
类 tortoise.fields.data.FloatField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶ 浮点(双精度)字段。
- field_type¶
float的别名
-
tortoise.fields.data.IntEnumField(enum_type, description=
None, **kwargs)[源代码]¶ 枚举字段
表示整数枚举的字段。
如果未指定为多行“名称:值”对列表,则自动设置字段的描述。
注意:
enum_type的有效 int 值是可接受的。enum_type:枚举类
description:字段的描述。如果未指定为“名称:值”对的多行列表,则会自动设置。
- 返回类型:¶
IntEnum
-
class tortoise.fields.data.IntField(primary_key=
None, **kwargs)[source]¶ 整数字段。(32 位有符号)
primary_key(布尔值)如果字段是主键,则为 True。
- field_type¶
int的别名
- class tortoise.fields.data.JSONField(encoder=<function <lambda>>, decoder=<built-in function loads>, **kwargs)[source]¶
JSON 字段。
此字段可以存储任何 JSON 兼容结构的字典或列表。
你可以指定你自己的自定义 JSON 编码器/解码器,保留默认值应该可以很好地工作。如果你安装了
orjson,我们默认使用它,否则将使用默认的json模块。encoder:自定义 JSON 编码器。
decoder:自定义 JSON 解码器。
-
类 tortoise.fields.data.SmallIntField(primary_key=
None, **kwargs)[源代码]¶ 小整数字段。(16 位有符号)
primary_key(布尔值)如果字段是主键,则为 True。
-
类 tortoise.fields.data.TextField(primary_key=
None, unique=False, db_index=False, **kwargs)[源代码]¶ 大文本字段。
- field_type¶
str的别名
-
类 tortoise.fields.data.TimeDeltaField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶ 用于存储时间差的字段。
- 类 tortoise.fields.data.UUIDField(**kwargs)[源代码]¶
UUID 字段
此字段可以存储 uuid 值。
如果用作主键,它将默认自动生成 UUID4。
- field_type¶
UUID的别名
关系字段¶
-
tortoise.fields.relational.ForeignKeyField(model_name: str, related_name: str | None | False =
None, on_delete: OnDelete =CASCADE, db_constraint: bool =True, *, null: True, **kwargs: Any) ForeignKeyFieldInstance[MODEL] | None[source]¶ -
tortoise.fields.relational.ForeignKeyField(model_name: str, related_name: str | None | False =
None, on_delete: OnDelete =CASCADE, db_constraint: bool =True, null: False =False, **kwargs: Any) ForeignKeyFieldInstance[MODEL] 外键关系字段。
此字段表示与另一个模型的外键关系。
有关用法信息,请参见外键。
你必须提供以下内容
model_name:相关模型的名称,格式为
'app.model'。
以下内容是可选的
related_name:相关模型上的属性名称,用于反向解析外键。
on_delete:- 其中之一
field.CASCADE:指示如果删除相关模型,则应级联删除该模型。
field.RESTRICT:指示只要外键指向相关模型,则将限制删除相关模型。
field.SET_NULL:如果删除相关模型,则将字段重置为 NULL。仅当字段已设置
null=True时才能设置。field.SET_DEFAULT:如果删除相关模型,则将字段重置为
default值。仅当字段已设置default时才能设置。field.NO_ACTION:不采取任何操作。
to_field:相关模型上的属性名称,用于建立外键关系。如果未设置,则使用 pk
db_constraint:控制是否应为此外键在数据库中创建约束。默认值为 True,这几乎肯定是你想要的;将其设置为 False 可能对数据完整性非常不利。
-
tortoise.fields.relational.ManyToManyField(model_name, through=
None, forward_key=None, backward_key='', related_name='', on_delete=OnDelete.CASCADE, db_constraint=True, create_unique_index=True, **kwargs)[source]¶ 多对多关系字段。
此字段表示此模型与另一个模型之间的多对多关系。
有关用法信息,请参见多对多。
你必须提供以下内容
model_name:相关模型的名称,格式为
'app.model'。
以下内容是可选的
through:表示中间表的数据库表。默认值通常是安全的。
forward_key:中间表上的正向查找键。默认值通常是安全的。
backward_key:中间表上的反向查找键。默认值通常是安全的。
related_name:相关模型上的属性名称,用于反向解析多对多关系。
db_constraint:控制是否应为此外键在数据库中创建约束。默认值为 True,这几乎肯定是你想要的;将其设置为 False 可能对数据完整性非常不利。
on_delete:- 其中之一
field.CASCADE:指示如果删除相关模型,则应级联删除该模型。
field.RESTRICT:指示只要外键指向相关模型,则将限制删除相关模型。
field.SET_NULL:如果删除相关模型,则将字段重置为 NULL。仅当字段已设置
null=True时才能设置。field.SET_DEFAULT:如果删除相关模型,则将字段重置为
default值。仅当字段已设置default时才能设置。field.NO_ACTION:不采取任何操作。
create_unique_index:控制是否应在数据库中创建唯一索引以加快选择查询。默认值为 True。如果您希望允许重复记录,请将其设置为 False。
- 返回类型:¶
ManyToManyRelation[Any]
-
tortoise.fields.relational.OneToOneField(model_name: str, related_name: str | None | False =
None, on_delete: OnDelete =CASCADE, db_constraint: bool =True, *, null: True, **kwargs: Any) OneToOneFieldInstance[MODEL] | None[source]¶ -
tortoise.fields.relational.OneToOneField(model_name: str, related_name: str | None | False =
None, on_delete: OnDelete =CASCADE, db_constraint: bool =True, null: False =False, **kwargs: Any) OneToOneFieldInstance[MODEL] 一对一关系字段。
此字段表示与另一个模型的外键关系。
有关用法信息,请参见 一对一。
你必须提供以下内容
model_name:相关模型的名称,格式为
'app.model'。
以下内容是可选的
related_name:相关模型上的属性名称,用于反向解析外键。
on_delete:- 其中之一
field.CASCADE:指示如果删除相关模型,则应级联删除该模型。
field.RESTRICT:指示只要外键指向相关模型,则将限制删除相关模型。
field.SET_NULL:如果删除相关模型,则将字段重置为 NULL。仅当字段已设置
null=True时才能设置。field.SET_DEFAULT:如果删除相关模型,则将字段重置为
default值。仅当字段已设置default时才能设置。field.NO_ACTION:不采取任何操作。
to_field:相关模型上的属性名称,用于建立外键关系。如果未设置,则使用 pk
db_constraint:控制是否应为此外键在数据库中创建约束。默认值为 True,这几乎肯定是你想要的;将其设置为 False 可能对数据完整性非常不利。
特定于数据库的字段¶
MySQL¶
-
类 tortoise.contrib.mysql.fields.GeometryField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶
-
类 tortoise.contrib.mysql.fields.UUIDField(binary_compression=
True, **kwargs)[源代码]¶ UUID 字段
此字段可以存储 uuid 值,但可以选择添加二进制压缩。
如果用作主键,它将默认自动生成 UUID4。
binary_compression(布尔值)如果为 True,则 UUID 将以二进制格式存储。这将在数据库中为每个 UUID 节省 6 个字节。注意:这是一个仅限 MySQL 的功能。有关更多详细信息,请参阅 https://dev.mysqlserver.cn/blog-archive/mysql-8-0-uuid-support/。
Postgres¶
-
类 tortoise.contrib.postgres.fields.TSVectorField(source_field=
None, generated=False, primary_key=None, null=False, default=None, unique=False, db_index=None, description=None, model=None, validators=None, **kwargs)[源代码]¶
扩展字段¶
可以对字段进行子类化,允许使用任意类型,只要它们可以用与数据库兼容的格式表示即可。一个示例是围绕 CharField 的一个简单包装器,用于存储和查询枚举类型。
from enum import Enum
from typing import Type
from tortoise import ConfigurationError
from tortoise.fields import CharField
class EnumField(CharField):
"""
An example extension to CharField that serializes Enums
to and from a str representation in the DB.
"""
def __init__(self, enum_type: Type[Enum], **kwargs):
super().__init__(128, **kwargs)
if not issubclass(enum_type, Enum):
raise ConfigurationError("{} is not a subclass of Enum!".format(enum_type))
self._enum_type = enum_type
def to_db_value(self, value: Enum, instance) -> str:
return value.value
def to_python_value(self, value: str) -> Enum:
try:
return self._enum_type(value)
except Exception:
raise ValueError(
"Database value {} does not exist on Enum {}.".format(value, self._enum_type)
)
在进行子类化时,请确保 to_db_value 返回与超类相同的类型(在 CharField 的情况下,即 str),并且 to_python_value 自然接受值参数中相同的类型(也为 str)。