Любой Python ORM в полной мере использует функцию NoSQL без схемы? - PullRequest
1 голос
/ 18 декабря 2011

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

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

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

1 Ответ

3 голосов
/ 18 декабря 2011

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

Если вы хотите описанное вами поведение, вы можете проверить Mongoengine , ODM (объект-документ-сопоставитель) для 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").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...