如何在 mongoengine/pymongo 中设置固定字段
How to set a fixed field in 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)
我想为 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)