如何在 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)