介绍
Tortoise ORM 自带的功能对DatetimeField字段,可以设置auto_now和auto_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__里,总之在更新语句之前被执行到即可。