Skip to content

常用参数

所有字段类型都有一组通用参数。

主键

Primary_key: bool = False -> 默认为 False。

设置表上的主键列,外键始终引用模型的 pk。

仅在 sql 中使用。

自动增量

自动增量:bool = Primary_key 且 type == int -> 如果列是主键且类型为 Integer,则默认为 True,否则为 False。

只能与 int/bigint 字段一起使用。

如果字段具有自动增量,则它变为可选。

在 sql 和 pydantic 中使用(将 pk 字段更改为自动增量的可选字段)。

可为空的

可空:bool = False -> 对于除关系字段之外的所有字段默认为 False。

如果用户提供以下其中一项,则自动更改为 True:

  • 提供默认值或函数
  • 提供了 server_default 值或函数
  • 在 Integerprimary_key 字段上设置自动增量

指定字段是可选的还是必需的,与 sql 和 pydantic 一起使用。

默认情况下,用于 pydantic 和 sqlalchemy,因为这些是最常见的设置:

  • nullable=False - 表示数据库列不为空并且 pydantic 中需要字段
  • nullable=True - 表示数据库列为空并且字段在 pydantic 中是可选的

如果你想为 pydantic 和数据库设置不同的设置,请参阅下面的 sql_nullable 。

!!!注意 默认情况下,所有外键也可为空,这意味着不需要相关模型。

1
If you change the `ForeignKey` column to `nullable=False`, it becomes required.

sql_nullable

sql_nullable: bool = nullable -> 默认为 nullable 值(如上所述)。

指定字段是否不为空或仅允许数据库中为空。

仅当您想在 pydantic 模型和数据库中设置不同的选项时,才将此设置与 nullable 结合使用。

示例用法可能是使数据库中的字段不为空,但允许该字段在 pydantic 中可为空(即使用 server_default 值)。这将阻止字段更新为空(与 server_default 设置一样,您不能插入空值,因为将使用默认值)

默认

默认值:Any = None -> 默认为 None。

如果没有传递其他值,则使用默认值。

在插入时调用的 sql 中,在 pydantic 模型定义期间使用。

如果该字段有默认值,则它变为可选。

您可以传递静态值或可调用(函数等)

在 sql 和 pydantic 中都使用。

使用示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# note the distinction between passing a value and Callable pointer

# value
name: str = ormar.String(max_length=200, default="Name")

# note that when you call a function it's not a pointer to Callable
# a definition like this will call the function at startup and assign
# the result of the function to the default, so it will be constant value for all instances
created_date: datetime.datetime = ormar.DateTime(default=datetime.datetime.now())

# if you want to pass Callable reference (note that it cannot have arguments)
# note lack of the parenthesis -> ormar will call this function for you on each model
created_date: datetime.datetime = ormar.DateTime(default=datetime.datetime.now)

# Callable can be a function, builtin, class etc.

服务器默认值

server_default: Any = None -> 默认为 None。

如果没有传递其他值,则使用默认值。

在服务器端调用的 sql 中,因此您可以传递 ie sql 函数(如 now() 或包装在 sqlalchemy text() 子句中的查询/值)。

如果该字段具有 server_default 值,则它变为可选。

您可以传递静态值或可调用(函数等)

仅在 sql 中使用。

使用示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from datetime import datetime

import databases
import ormar
import sqlalchemy
from sqlalchemy import func, text

database = databases.Database("sqlite:///test.db")
metadata = sqlalchemy.MetaData()


class Product(ormar.Model):

    ormar_config = ormar.OrmarConfig(
        database=database, metadata=metadata, tablename="product"
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    company: str = ormar.String(max_length=200, server_default="Acme")
    sort_order: int = ormar.Integer(server_default=text("10"))
    created: datetime = ormar.DateTime(server_default=func.now())

!!! warning server_default 接受 str, sqlalchemy.sql.elements.ClauseElement 或者 sqlalchemy.sql.elements.TextClause 因此,如果您想设置 ie 整数值,您需要将其包装在 sqlalchemy.text() 函数中,如上面所示

!!!提示您还可以传递包含在 sqlalchemy.text() 中的有效 sql(特定于方言)

1
For example `func.now()` above could be exchanged for `text('(CURRENT_TIMESTAMP)')` for sqlite backend

!!!info server_default 直接传递到 sqlalchemy 表定义,因此您可以在服务器默认 sqlalchemy 文档中阅读更多信息

姓名

name: str = None -> 默认为 None

允许您指定要使用的列名别名。

对于使用保留关键字的现有数据库结构很有用,或者如果您想使用与 ormar 字段名称不同的数据库名称。

以下面的代码片段为例。

from 作为 python 中的保留字,将阻止您使用该列名创建模型。

将模型名称更改为 from_ 并添加参数 name='from' 将导致 ormar 使用 from 作为数据库列名称。

1
2
 #... rest of Model cut for brevity
 from_: str = ormar.String(max_length=15, name='from')

同样,您可以更改数据库中的外键列名称,同时保留 ormar 中所需的关系名称:

1
2
 # ... rest of Model cut for brevity
album: Optional[Album] = ormar.ForeignKey(Album, name="album_id")

指数

索引:bool = False -> 默认为False,

设置表列的索引。

仅在 sql 中使用。

独特的

唯一:bool = False

设置表列的唯一约束。

仅在 sql 中使用。

覆盖_pydantic_type

默认情况下,ormar 使用预定义的 pydantic 字段类型,该类型应用于模型创建(因此类型提示是可选的)。

如果您愿意,您可以应用自己的类型,这将完全取代内置类型。因此,作为用户,您有责任提供在给定 ormar 字段类型的上下文中有效的类型。

警告注意,默认情况下,您应该使用传递给底层 pydantic 字段的内置参数。

1
You can check what arguments are supported in field types section or in [pydantic](https://pydantic-docs.helpmanual.io/usage/schema/#field-customisation) docs.

!!!危险 设置错误类型的 pydantic 字段可能会破坏您的模型,因此只有当您知道自己在做什么时才覆盖它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
As it's easy to break functionality of ormar the `overwrite_pydantic_type` argument is not available on relation fields!


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata
    database=database
)


# sample overwrites
class OverwriteTest(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="overwrites")

    id: int = ormar.Integer(primary_key=True)
    my_int: str = ormar.Integer(overwrite_pydantic_type=PositiveInt)
    constraint_dict: Json = ormar.JSON(
        overwrite_pydantic_type=Optional[Json[Dict[str, int]]])