【问题标题】:How to use Postgresql Array field in Tortoise-ORM如何在 Tortoise-ORM 中使用 Postgresql 数组字段
【发布时间】:2021-01-17 12:18:51
【问题描述】:

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

似乎做得正确我需要从 asyncpg 构建(因为它具有完整的数组支持)向上扩展 Tortoise Field。但是,我刚从 Tortoise 开始,也许有一些更好/更简单的方法/有人已经做了类似的事情。

【问题讨论】:

    标签: python postgresql asyncpg tortoise-orm


    【解决方案1】:

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

    
    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[]

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2021-05-03
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2020-08-30
      • 2023-02-12
      • 2020-11-16
      相关资源
      最近更新 更多