python - save() 方法后如何修改 peewee 自定义字段?
问题描述
例如,我有一个模型:
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()
方法中,而不是放在字段类中。
推荐阅读
- apache-nifi - Apache Nifi:在同一流程中使用 HandleHTTPRequest 和 GetFile
- javascript - member.addRole(role.id).then(member => { ^ TypeError: Cannot read property 'id' of null
- python - 为什么我收到错误“不允许重复名称”?
- bash - 编写一个 shell 脚本来找出三个数字中最大的一个。获取用户输入并显示结果
- javascript - 在函数中调用 setState(),并在状态改变后继续执行下一个同级函数——这可能吗?
- json - 如何在apache spark中使用来自kafka主题的python读取json数据
- hyperledger-fabric - 带 TLS 的 Docker Swarm 模式下的 Hyperledger 设置
- angular - 使用 API 并在图表/Angular 中显示项目
- java - 访问被拒绝异常:testNG java.IOException
- c# - 如何在 ASP.NET Core 中获取已注册中间件的列表?