任何Python ORM都充分利用NoSQL的无架构功能?

时间:2011-12-18 14:08:18

标签: python mongodb orm nosql

我用Django-nonrel尝试了MongoDB(这是Django项目的NoSQL分支)。在它的ORM中,类只能从抽象类继承,所以即使两个类继承自同一个基类,它们也会被保存到MongoDB中的不同集合中。

此设计为无架构数据库添加了预定义架构,现在每个集合都有其独特的架构。

我想要的是,如果ClassA和ClassB是从BaseClass继承的,那么ClassA和ClassB的每个实例都应该放在同一个集合中(或者除了MongoDB之外的NoSQL中类似的东西)

1 个答案:

答案 0 :(得分:3)

Django-nonrel的目标是保持与Django的ORM相同的行为,但允许使用非关系存储后端。由于Django不允许将多个不同的模型存储在同一个(关系)表中,因此我不会惊讶地发现Django-nonrel也没有。

如果你想要你所描述的行为,你可以查看Mongoengine,一个用于MongoDB的ODM(对象文档映射器),它受到Django ORM的启发,并且具有与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()

由于TextBlogPostImageBlogPost都从BlogPost继承,因此它们都会保存在同一个集合中(默认情况下,名为“blog_post”)。