2011-12-18 17 views
1

我試圖Django-nonrel(這是Django項目的NoSQL分支)與MongoDB。在ORM中,類只能從抽象類繼承,所以即使兩個類都從同一個基類繼承,它們也會保存到MongoDB中的不同集合中。任何Python ORM都充分利用了NoSQL的無模式特性?

此設計爲無模式數據庫添加了預定義的模式,現在每個集合都有其獨特的模式。

我要的是,如果ClassA和ClassB的從BaseClass的,ClassA和ClassB的的每個實例都應該放在同一個集合(或超過的MongoDB在NoSQL的類似的東西等)

+1

文檔數據庫ORM的關鍵點不是什麼關係?爲什麼所有的抽象?如果你直接使用數據庫驅動程序,我猜會更容易。 – mnemosyn 2011-12-18 14:17:17

回答

3

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」)。

+0

謝謝:-)我試過mongoengine,它工作正常:-) – yegle 2011-12-19 02:51:08