Позволяет ли django определять разные наборы полей для каждого документа в mongodb?

Django и MongoDB

Поддержка different set of fields for each document in a collection - одна из функций MongoDB. Он позволяет хранить похожие данные, но с разными свойствами в одной коллекции.

Например:

{
        _id: ObjectId("51156a1e056d6f966f268f81"),
        type: "Article",
        author: "Derick Rethans",
        title: "Introduction to Document Databases with MongoDB",
        date: ISODate("2013-04-24T16:26:31.911Z"),
        body: "This arti…"
},
{
        _id: ObjectId("51156a1e056d6f966f268f82"),
        type: "Book",
        author: "Derick Rethans",
        title: "php|architect's Guide to Date and Time Programming with PHP",
        isbn: "978-0-9738621-5-7"
}

Django по умолчанию не поддерживает нереляционные базы данных, такие как mongodb, но для этой цели есть несколько библиотек. например Движок Django MongoDB - это серверная часть MongoDB для Django.

MongoDB позволяет использовать разные наборы полей для каждого документа в коллекции, но в django вы должны определить models.py:

from django.db import models

from djangotoolbox.fields import ListField


class Post(models.Model):
    title = models.CharField()
    text = models.TextField()
    tags = ListField()
    comments = ListField()

Вопрос: есть ли способ определить разные наборы полей для каждого документа в коллекции в MongoDB при использовании Django?

2
0
404
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Альтернатива

Мне нравится использовать django-mongoengine, поскольку он упрощает работу с моделями MongoDB.

Например, вы можете создать структурированные Document, которые будут преобразованы в модели, или EmbeddedDocument, которые представляют собой структурированные документы для использования в уже существующей модели.

from django_mongoengine import Document, EmbeddedDocument, fields

class Comment(EmbeddedDocument):
    created_at = fields.DateTimeField(
        default=datetime.datetime.now, editable=False,
    )
    author = fields.StringField(verbose_name="Name", max_length=255)
    email  = fields.EmailField(verbose_name="Email")
    body = fields.StringField(verbose_name="Comment")

class Post(Document):
    created_at = fields.DateTimeField(
        default=datetime.datetime.now, editable=False,
    )
    title = fields.StringField(max_length=255)
    slug = fields.StringField(max_length=255, primary_key=True)
    comments = fields.ListField(
        fields.EmbeddedDocumentField('Comment'), blank=True,
    )

Ответ

Итак, для вашего случая вам нужно использовать Схемы динамических документов, который работает так же, как Document, но любые данные / атрибуты, установленные для них, также будут сохранены.

class Page(DynamicDocument):
    title = StringField(max_length=200, required=True)

# Create a new page and add tags
>>> page = Page(title='Using MongoEngine')
>>> page.tags = ['mongodb', 'mongoengine']
>>> page.save()

>>> Page.objects(tags='mongoengine').count()
>>> 1

Другие вопросы по теме