创建与我的模型相同的棉花糖模式的日子已经一去不复返了。我发现这个优秀的答案 https://stackoverflow.com/a/42892443/4097322这解释了我如何使用简单的装饰器从 SQA 模型自动生成模式,因此我实现了它并替换了已弃用的ModelSchema
对于较新的SQLAlchemyAutoSchema
:
def add_schema(cls):
class Schema(SQLAlchemyAutoSchema):
class Meta:
model = cls
cls.Schema = Schema
return cls
这很有效……直到我撞到了一个身上有血迹的模型Enum
.
错误:Object of type MyEnum is not JSON serializable
我在网上搜索了一下,发现这个有用的答案 https://stackoverflow.com/a/45026116.
但我想将它实现为装饰器的一部分,以便它也自动生成。换句话说,我想自动覆盖模型中的所有枚举EnumField(TheEnum, by_value=True)
当使用生成模式时add_schema
装饰器;这样我就不必手动覆盖所有字段。
最好的方法是什么?
我发现最初建议的对枚举类型的支持仅在以下情况下才有效OneOf
是唯一存在于的验证类field_details
。我添加了一些参数解析(通过寻找基本的方式choices
对结果进行字符串化后_repr_args()
from OneOf https://marshmallow.readthedocs.io/en/stable/_modules/marshmallow/validate.html#OneOf)来检查验证类,以期使该实现更加通用:
def add_schema(cls):
class Schema(ma.SQLAlchemyAutoSchema):
class Meta:
model = cls
fields = Schema._declared_fields
# support for enum types
for field_name, field_details in fields.items():
if len(field_details.validate) > 0:
check = str(field_details.validate[0]._repr_args)
if check.__contains__("choices") :
enum_list = field_details.validate[0].choices
enum_dict = {enum_list[i]: enum_list[i] for i in range(0, len(enum_list))}
enum_clone = Enum(field_name.capitalize(), enum_dict)
fields[field_name] = EnumField(enum_clone, by_value=True, validate=validate.OneOf(enum_list))
cls.Schema = Schema
return cls
谢谢jgozal
对于最初的解决方案,因为我当前的项目确实需要这个领导。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)