You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:41:04