这里写自定义目录标题
使用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中可以这么操作)