- MongoEngine 教程
- MongoEngine - 首页
- MongoEngine - MongoDB
- MongoEngine - MongoDB Compass
- MongoEngine - 对象文档映射器
- MongoEngine - 安装
- MongoEngine - 连接到 MongoDB 数据库
- MongoEngine - 文档类
- MongoEngine - 动态模式
- MongoEngine - 字段
- MongoEngine - 添加/删除文档
- MongoEngine - 查询数据库
- MongoEngine - 过滤器
- MongoEngine - 查询操作符
- MongoEngine - QuerySet 方法
- MongoEngine - 排序
- MongoEngine - 自定义 QuerySet
- MongoEngine - 索引
- MongoEngine - 聚合
- MongoEngine - 高级查询
- MongoEngine - 文档继承
- MongoEngine - 原子更新
- MongoEngine - Javascript
- MongoEngine - GridFS
- MongoEngine - 信号
- MongoEngine - 文本搜索
- MongoEngine - 扩展
- MongoEngine 有用资源
- MongoEngine - 快速指南
- MongoEngine - 有用资源
- MongoEngine - 讨论
MongoEngine - 文档继承
可以定义任何用户定义的 Document 类的继承类。如果需要,继承类可以添加额外的字段。但是,由于这样的类不是 Document 类的直接子类,因此它不会创建新的集合,而是其对象存储在其父类使用的集合中。在父类中,元属性“allow_inheritance 在下面的示例中,我们首先将 employee 定义为文档类并将 allow_inheritance 设置为 true。salary 类派生自 employee,并添加了两个新的字段 dept 和 sal。Employee 和 salary 类的对象都存储在 employee 集合中。
在下面的示例中,我们首先将 employee 定义为文档类并将 allow_inheritance 设置为 true。salary 类派生自 employee,并添加了两个新的字段 dept 和 sal。Employee 和 salary 类的对象都存储在 employee 集合中。
from mongoengine import *
con=connect('newdb')
class employee (Document):
name=StringField(required=True)
branch=StringField()
meta={'allow_inheritance':True}
class salary(employee):
dept=StringField()
sal=IntField()
e1=employee(name='Bharat', branch='Chennai').save()
s1=salary(name='Deep', branch='Hyderabad', dept='Accounts', sal=25000).save()
我们可以通过以下方式验证两个文档是否存储在 employee 集合中:
{
"_id":{"$oid":"5ebc34f44baa3752530b278a"},
"_cls":"employee",
"name":"Bharat",
"branch":"Chennai"
}
{
"_id":{"$oid":"5ebc34f44baa3752530b278b"},
"_cls":"employee.salary",
"name":"Deep",
"branch":"Hyderabad",
"dept":"Accounts",
"sal":{"$numberInt":"25000"}
}
请注意,为了识别相应的 Document 类,MongoEngine 添加了一个“_cls”字段并将其值设置为“employee”和“employee.salary”。
如果希望为一组 Document 类提供额外的功能,但又不想使用继承带来的开销,则可以先创建一个抽象类,然后从该类派生一个或多个类。要使类成为抽象类,将元属性“abstract”设置为 True。
from mongoengine import *
con=connect('newdb')
class shape (Document):
meta={'abstract':True}
def area(self):
pass
class rectangle(shape):
width=IntField()
height=IntField()
def area(self):
return self.width*self.height
r1=rectangle(width=20, height=30).save()
广告