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()
我们可以验证两个文件存储在雇员集合中,如下图所示
{
"_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()