有没有Python ORM充分利用NoSQL的无模式特性?

1 投票
1 回答
1228 浏览
提问于 2025-04-17 08:35

我尝试过使用 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()

因为TextBlogPostImageBlogPost都继承自BlogPost,所以它们都会被保存到同一个集合里(默认名为“blog_post”)。

撰写回答