Любой Python ORM в полной мере использует функцию NoSQL без схемы?

1

Я попробовал Django-nonrel (который является вилкой NoSQL проекта Django) с MongoDB. В нем ORM класс может наследовать только от абстрактного класса, поэтому даже два класса наследуются от одного и того же базового класса, они сохраняются в разных коллекциях в MongoDB.

Этот проект добавил предопределенную схему в базу данных без схемы, каждая коллекция имеет свою уникальную схему.

Я хочу, если ClassA и ClassB унаследованы от BaseClass, каждый экземпляр ClassA и ClassB должен быть помещен в ту же коллекцию (или что-то подобное в NoSQL, кроме MongoDB)

  • 1
    Какой смысл ORM для базы данных документов, которая никоим образом не является реляционной? Почему вся абстракция? Если бы вы использовали драйвер db напрямую, я думаю, было бы проще.
Теги:
orm
nosql

1 ответ

3
Лучший ответ

Цель Django-нерела состоит в том, чтобы поддерживать то же поведение, что и Django ORM, но разрешить использование резервных копий без реляционной памяти. Поскольку Django не позволяет хранить несколько разных моделей в одной и той же (реляционной) таблице, я не удивлюсь, узнав, что Django-нереал также не является.

Если вы хотите, чтобы вы описали поведение, вы можете проверить MongoDyno, ODM (object-document mapper) для MongoDB, который вдохновлен и похож на 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").

  • 0
    Спасибо :-) Я попробовал mongoengine, и он отлично работает :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню