Tortoise ORM 数据更新自动修改更新时间 Python

1,007 阅读1分钟

介绍

Tortoise ORM 自带的功能对DatetimeField字段,可以设置auto_nowauto_now_add属性,在insert时自动填充日期,但没有设置auto_now_update的属性。

解决思路

QuerySet自带的update方法,也没有设置自动更新某个字段的地方,那就从打补丁的思路解决,即替换QuerySet类的原update方法。

代码

import datetime
from typing import Type, Any
from tortoise.queryset import MODEL, QuerySet as _QuerySet, UpdateQuery

class QuerySet(_QuerySet):
    def __init__(self, model: Type[MODEL]) -> None:
        super().__init__(model)

    def update(self, **kwargs: Any):
        """重载update方法,加入updated_time自动更新"""
        if hasattr(self.model, "updated_time") and "updated_time" not in kwargs:
            kwargs["updated_time"] = datetime.datetime.now()
        return UpdateQuery(
            db=self._db,
            model=self.model,
            update_kwargs=kwargs,
            q_objects=self._q_objects,
            annotations=self._annotations,
            custom_filters=self._custom_filters,
        )


_QuerySet.update = QuerySet.update

操作

把这段代码放在models里或模块的__init__里,总之在更新语句之前被执行到即可。