如何在 mongoengine/pymongo 中设置固定字段



我想为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)

最新更新