Python MongoEngine扩展Document类后子类实例无法保存如何解决?
问题原因
你定义的DocumentExtended基类未被标记为抽象类,MongoEngine 默认会将所有直接继承Document的类映射为独立的数据库集合,开启allow_inheritance后子类User的数据会默认存储到DocumentExtended对应的document_extended集合中,而非你预期的user集合,因此会出现“保存失败”的错觉。
解决方案
给DocumentExtended的meta配置中新增'abstract': True参数,将其标记为抽象基类即可,完整示例如下:
from mongoengine import Document, StringField class DocumentExtended(Document): meta = { 'abstract': True, 'allow_inheritance': True } # 此处添加你的自定义公共方法 def your_custom_method(self): # 自定义逻辑实现 pass class User(DocumentExtended): name = StringField() # 实例可正常保存到user集合,和直接继承Document的行为完全一致 User(name="John Smith").save()
配置说明
abstract: True:标记该类为抽象基类,MongoEngine 不会为其创建独立的数据库集合,所有继承该类的子类会按照自身类名(或子类meta中指定的collection参数)映射对应集合- 抽象基类中定义的所有字段、方法都会被子类正常继承,完全满足扩展
Document基础功能的需求 - 如果你实际需要使用单集合多态存储(所有子类数据都存在父类对应的同一个集合中),则查询时需要通过父类
DocumentExtended进行查询,或者在子类的meta中明确指定collection参数即可正常读写
内容的提问来源于stack exchange,提问作者isebarn
相关产品推荐
相关产品推荐

