2011-12-18 8 views
1

私はDjango-nonrel(これはDjangoプロジェクトのNoSQLフォークです)をMongoDBと試してみました。 ORMでは、classは抽象クラスのみを継承することができるので、2つのクラスであっても同じ基本クラスから継承しても、MongoDBの異なるコレクションに保存されます。Python ORMは、NoSQLのスキーマレス機能をフルに活用していますか?

このデザインでは、スキーマレスデータベースにあらかじめ定義されたスキーマが追加されました。すべてのコレクションに固有のスキーマが追加されました。

にClassAとClassBのは、BaseClassのから継承されている場合は私がしたいことにClassAとClassBののすべてのインスタンスが同じコレクション(またはMongoDBの以外のNoSQLで似たような)に配置する必要があり、ある

+1

どのような関係でもない文書データベースのORMのポイントは何ですか?なぜすべての抽象化? dbドライバを直接使用した方が簡単だと思います。 – mnemosyn

答えて

3

Django-の目標nonrelは、DjangoのORMと同じ動作を維持するが、非リレーショナルストレージバックエンドを使用できるようにすることです。 Djangoは複数の異なるモデルを同じ(リレーショナル)テーブルに格納することを許可していないので、Django-nonrelにも当てはまらないことに驚くことはありません。

説明したような動作をしたい場合は、MongoDBのODM(オブジェクトドキュメントマッパー)であるMongoengineをチェックしてみてください。これは、Django ORMに触発されていますが、あなたが説明したような行動をします。 TextBlogPostImageBlogPost両方以来

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() 

継承BlogPostから、それらは両方とも同じに保存されます:Mongoengineを使用するときに特に

、あなたは、そのレコードのように同じコレクションに格納されている複数のクラスを作成することができますコレクション(デフォルトでは、 "blog_post"という名前)。

+0

ありがとう:-)私はmongoengineを試して、それはうまく動作します:-) – yegle

関連する問題