有没有Python ORM充分利用NoSQL的无模式特性?
我尝试过使用 Django-nonrel
(这是一个基于Django项目的NoSQL版本)来搭配 MongoDB
。在它的对象关系映射(ORM)中,类只能继承自抽象类。所以即使两个类都继承自同一个基类,它们在MongoDB中也会被保存到不同的集合里。
这个设计给本来没有固定结构的数据库添加了一个预定义的结构,现在每个集合都有自己独特的结构。
我想要的是,如果ClassA和ClassB都继承自BaseClass,那么ClassA和ClassB的每个实例都应该放在同一个集合里(或者在其他NoSQL数据库中有类似的做法)。
1 个回答
4
Django-nonrel的目标是保持与Django的ORM(对象关系映射)相同的行为,但允许使用非关系型的存储方式。因为Django不允许把不同的模型存储在同一个(关系型)表里,所以我也不惊讶Django-nonrel不支持这个功能。
如果你想要你描述的那种行为,可以看看Mongoengine,这是一个为MongoDB设计的ODM(对象文档映射器),它的灵感来自Django ORM,感觉也很相似,但允许更灵活的结构和行为,正如你所描述的那样。
特别是,当使用Mongoengine时,你可以创建多个类,它们的记录会存储在同一个集合中,比如:
class BlogPost(mongoengine.Document):
create_date = mongoengine.DateTimeField()
mod_date = mongoengine.DateTimeField()
title = mongoengine.StringField()
meta = {
'abstract': True,
}
def save(self):
if not self.pk:
self.create_date = datetime.utcnow()
self.mod_date = datetime.utcnow()
super(BlogPost, self).save()
class TextBlogPost(BlogPost):
body = mongoengine.StringField()
class ImageBlogPost(BlogPost):
image = mongoengine.FileField()
caption = mongoengine.StringField()
因为TextBlogPost
和ImageBlogPost
都继承自BlogPost
,所以它们都会被保存到同一个集合里(默认名为“blog_post”)。