我想为ProofModel
子类设置type_
字段且不可变。
class ProofType(Enum):
JWS = "RsaVerificationKey2018"
HASH = "Sha2"
class ProofModel(EmbeddedDocument):
type_ = EnumField(ProofType, required=True)
created = DateTimeField(default=datetime.now(), required=True)
meta = {"allow_inheritance": True}
class JwsProofModel(ProofModel):
type_ = EnumField(ProofType, default=ProofType.JWS)
jws = StringField(required=True)
class ShaProofModel(ProofModel):
type_ = EnumField(ProofType, default=ProofType.HASH)
hash_ = StringField(required=True)
我可以将其保留为上述内容,但我的需要是限制创建(例如)JwsProofModel
在实例化时指定type_
我看到 2 个选项:
1) (尚未发布)您可以滥用 EnumField 构造函数上的choices
参数,将允许的值限制为仅 1 个值。
class JwsProofModel(ProofModel):
type_ = EnumField(ProofType, default=ProofType.JWS, choices=[ProofType.JWS])
jws = StringField(required=True)
此功能仅在开发版本(未来的 0.23.2)上可用,但应该很快就会发布
2) 解决方法是使用自定义的每字段验证功能 (doc)
def is_jws(value):
if value != ProofType.JWS:
raise ValidationError("wrong value")
class JwsProofModel(Document):
type_ = EnumField(ProofType, default=ProofType.JWS, validation=is_jws)