MongoEngine继承文档类初始化与类属性规则咨询
关于MongoEngine的两个问题解答
1. 能否用super().__init__初始化继承MongoEngine Document的类?
可以,但你示例里的写法有误。你当前写的super(me.Document, self).__init__(*args, **kwargs)跳过了GenericItem自身的父类链,正确的写法应该是:
super().__init__(*args, **kwargs) # 或者明确指定当前类:super(GenericItem, self).__init__(*args, **kwargs)
MongoEngine的Document类的__init__方法负责处理字段初始化、默认值设置等核心逻辑,必须正确调用父类的__init__,否则你的MongoEngine字段可能无法正常工作——比如document_version的默认值1可能不会生效,甚至会引发字段相关的异常。
2. 类的每个属性都必须是MongoEngine字段吗?
完全不需要。像你示例里的self.trade这种实例属性,只是存在于内存中的普通Python属性,不会被MongoEngine持久化到MongoDB里,用来辅助填充其他字段是完全合法的。
需要注意两点:
- 这类非字段属性不要和已定义的MongoEngine字段同名,否则会覆盖字段的原有逻辑
- 如果某个属性需要被保存到数据库,才需要定义成MongoEngine的字段类型
修正后的示例代码
import mongoengine as me class GenericItem(me.Document): # MongoEngine Fields amount = me.IntField(min_value=1, required=True) price = me.EmbeddedDocumentField(PriceClass, required=True) trade_date = me.DateTimeField(required=True) # Document-Admin Fields last_update_date = me.DateField() document_version = me.IntField(default=1) # mongoengine stuff: meta = {'collection': 'BlotterCollection', 'allow_inheritance': True} def __init__(self, trade: CustomTradeClass, *args, **kwargs): # 正确调用父类初始化 super().__init__(*args, **kwargs) self.trade = trade self.amount = self.trade.amount self.price = self.trade.price self.trade_date = self.trade.trade_date
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

