如何在 save() 方法后修改 peewee 自定义字段?
How to modify peewee custom fields after save() method?
比如我有一个模型:
class ExampleModel(Base):
name = CharField(max_length=255)
image = ImageField(size=(200, 200))
class Meta:
table_name = 'example'
ImageField
- 这是我的自定义字段:
class ImageField(TextField):
thumb_size: Tuple[int, int] = None
def __init__(self, size: Tuple[int, int] = None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.thumb_size = size
def db_value(self, value):
# ...some file upload logic
return json.dumps({
'original': original_path,
'thumbnail': thumbnail_path
})
def python_value(self, value):
return json.loads(value)
当我保存实例时,一切都很好(body.image
有一个 starlette.datastructures.UploadFile
类型):
example: ExampleModel = dict_to_model(ExampleModel, body)
example.save()
但是,如果我在保存后检查 example.image
的类型,它仍然有 starlette.datastructures.UploadFile
类型。我如何在保存后修改图像字段,或者可能在 运行 db_value()
方法之后?
python_value()
和db_value()
分别用于读取和写入数据库。它们 不是 除了将值从一种数据类型转换为另一种数据类型之外执行任何魔法的地方,它们只是为来自数据库游标的值提供 Pythonic 数据类型。
换句话说,你把魔法放在了错误的地方。将其放在 save()
方法中,而不是放在字段 class.
中
比如我有一个模型:
class ExampleModel(Base):
name = CharField(max_length=255)
image = ImageField(size=(200, 200))
class Meta:
table_name = 'example'
ImageField
- 这是我的自定义字段:
class ImageField(TextField):
thumb_size: Tuple[int, int] = None
def __init__(self, size: Tuple[int, int] = None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.thumb_size = size
def db_value(self, value):
# ...some file upload logic
return json.dumps({
'original': original_path,
'thumbnail': thumbnail_path
})
def python_value(self, value):
return json.loads(value)
当我保存实例时,一切都很好(body.image
有一个 starlette.datastructures.UploadFile
类型):
example: ExampleModel = dict_to_model(ExampleModel, body)
example.save()
但是,如果我在保存后检查 example.image
的类型,它仍然有 starlette.datastructures.UploadFile
类型。我如何在保存后修改图像字段,或者可能在 运行 db_value()
方法之后?
python_value()
和db_value()
分别用于读取和写入数据库。它们 不是 除了将值从一种数据类型转换为另一种数据类型之外执行任何魔法的地方,它们只是为来自数据库游标的值提供 Pythonic 数据类型。
换句话说,你把魔法放在了错误的地方。将其放在 save()
方法中,而不是放在字段 class.