如何在 mongoengine/pymongo 中设置固定字段
Posted
技术标签:
【中文标题】如何在 mongoengine/pymongo 中设置固定字段【英文标题】:How to set a fixed field in mongoengine/pymongo 【发布时间】:2021-08-23 18:29:45 【问题描述】:我想为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_
的能力
【问题讨论】:
【参考方案1】:我看到了 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)
【讨论】:
它抛出ValueError: 'choices' can't be set on EnumField, it is implicitly set as the enum class
对,我说过,它只在开发版本(最新的master)上可用,但很快就会发布
我在帖子中添加了一个替代方案,虽然不是最优雅的,但在 EnumField 选择功能发布之前应该可以解决问题以上是关于如何在 mongoengine/pymongo 中设置固定字段的主要内容,如果未能解决你的问题,请参考以下文章