tortoise-orm创建表时指定字段顺序

这里写自定义目录标题

使用sqlalchemy时,可以通过sort_order字段指定创建表时的字段顺序,切换到tortoise-orm后,字段顺序不能自定义了,用起来很麻烦

废话不多说,直接上方法(需要修改源码)
第一步 修改Field类,增加field_order字段

# 只修改Field类的init方法
    def __init__(
        self,
        source_field: Optional[str] = None,
        generated: bool = False,
        primary_key: Optional[bool] = None,
        null: bool = False,
        default: Any = None,
        unique: bool = False,
        db_index: Optional[bool] = None,
        description: Optional[str] = None,
        model: "Optional[Model]" = None,
        validators: Optional[List[Union[Validator, Callable]]] = None,
        field_order: int = 0,  # 这里加一行,字段顺序
        **kwargs: Any,
    ) -> None:
        self.field_order = field_order   # 增加一个field_order属性

第二步 修改Tortoise.init

# 这里需要改两个地方
# 1. 在Tortoise中增加sort_fields方法
    @classmethod
    def sort_fields(cls):
        last_fields = []
        for app_name, app in cls.apps.items():
            for model_name, model in app.items():
                fields_order = {k: getattr(v, 'field_order', 0) for k, v in model._meta.fields_map.items()}
                model._meta.fields_db_projection = {
                    k: v for k, v in sorted(
                        model._meta.fields_db_projection.items(),
                        key=lambda x: fields_order.get(x[0], 0)
                    )
                }
# 2. 在Tortoise.init方法中增加sort_fields调用
    async def init():
        ....  # 上面的代码都不动
        
        cls._init_timezone(use_tz, timezone)
        await connections._init(connections_config, _create_db)
        cls._init_apps(apps_config)
        cls._init_routers(routers)
        cls.sort_fields()   # 就增加这一行

        cls._inited = True

第三步 在model定义的时候添加field_order参数

# 比如这样
class BaseDBModel(Model):
    id = fields.IntField(pk=True)
    is_deleted = fields.BooleanField(default=False, description='是否删除, 1=删除,0=未删除', field_order=995)
    created_by = fields.IntField(null=True, description='创建人', field_order=996)
    updated_by = fields.IntField(null=True, description='最后更新人', field_order=997)
    created_time = fields.DatetimeField(auto_now_add=True, description='创建时间', field_order=998)
    updated_time = fields.DatetimeField(auto_now=True, description='最后更新时间', field_order=999)

    class Mate:
        abstract = True
        ordering = ['-created_time']

PS: 如果找不到源码的位置可以import对应的类,然后按住ctrl点击对应的方法跳转(Pycharm中可以这么操作)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值