如何在 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 中设置固定字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)

在QGIS中如何添加天地图的WMTS

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

如何在Allegro中测量距离

如何在Allegro中测量距离

如何在Vue中嵌入React组件?如何在React中嵌入Vue组件?