如何在Tortoise ORM中使用Postgresql数组字段



与标题差不多,我正在尝试设置Tortoise ORM模型,该模型将包括与Postgresql Array列相对应的字段。

我似乎需要从asyncpg(因为它有完整的数组支持(向上扩展Tortoise Field来构建它。然而,我只是从乌龟开始,也许有更好/更容易的前进道路/有人已经做了类似的事情。

您需要实现自己的字段类型。这是我的实现:


from typing import List, Union, Type, Optional, Any
import json
from tortoise.fields.base import Field
from tortoise.models import Model

class IntArrayField(Field, list):
"""
Int Array field specifically for PostgreSQL.
This field can store list of int values.
"""
SQL_TYPE = "int[]"
def __init__(self, **kwargs):
super().__init__(**kwargs)
def to_db_value(
self, value: List[int], instance: "Union[Type[Model], Model]"
) -> Optional[List[int]]:
return value
def to_python_value(self, value: Any) -> Optional[List[int]]:
if isinstance(value, str):
array = json.loads(value.replace("'", '"'))
return [int(x) for x in array]
return value

我没有动态类型字段实现,从中制作它并不困难。

在某些情况下,您需要在to_db_valueto_python_value强制转换中添加更多的逻辑。例如,如果您正在使用UUID[]

您现在可以从乌龟(>= 0.19(的贡献部分使用ArrayField。

from tortoise.contrib.postgres.fields import ArrayField
int_array = ArrayField()
text_array = ArrayField(element_type="text")