【问题标题】:How to add additional fields to embedded documents without changing the original model如何在不更改原始模型的情况下向嵌入文档添加附加字段
【发布时间】:2016-09-27 06:37:33
【问题描述】:

我想在将一个文档嵌入到其他文档之前为其添加额外的属性,但我不知道该怎么做。

这是我的代码以及到目前为止我尝试过的内容:

from mongoengine import *
from datetime import datetime


class User(Document):
    name = StringField(max_length=80, required=True)
    created_at = DateTimeField(default=datetime.now(), required=True)
    updated_at = DateTimeField(default=datetime.now(), required=True)

    meta = {
        'collection': 'users'
    }

    def save(self, *args, **kwargs):
        self.updated_at = datetime.now()
        return super(User, self).save(*args, **kwargs)



class Stream(Document):
    users = EmbeddedDocumentListField(document_type='User')
    created_at = DateTimeField(default=datetime.now(), required=True)
    updated_at = DateTimeField(default=datetime.now(), required=True)

    meta = {
        'collection': 'streams'
    }

    def save(self, *args, **kwargs):
        self.updated_at = datetime.now()
        return super(Stream, self).save(*args, **kwargs)

当我将user document 嵌入到流的用户EmbeddedDocumentListField 时,它将被添加并看起来像这样

{
    "_id" : ObjectId("57e6123fe8c39b18b1a13431"),
    "users" : [
        {
            "_id" : ObjectId("57e6123fe8c39b18b1a13432"),
            "name": "Rohit Khatri",
            "created_at" : ISODate("2016-09-24T11:12:23.182Z"),
            "updated_at" : ISODate("2016-09-24T11:12:23.301Z")
        }
    ],
    "created_at" : ISODate("2016-09-24T11:12:23.189Z"),
    "updated_at" : ISODate("2016-09-24T11:12:23.323Z")
}

现在我想在用户文档中嵌入额外的属性,比如角色。这是我尝试过的:-

user = User.objects.create(name='Rohit Khatri')
user.roles = ['admin','writer']

stream = Stream.objects.create()
stream.users.append(user)
stream.save()

但它没有添加角色字段,如果有人可以帮助我,将不胜感激。

谢谢

【问题讨论】:

    标签: python django mongoengine embedded-documents


    【解决方案1】:

    使用更新方法设置新属性

    user.update(set__roles = ['admin','writer'])
    

    【讨论】:

    • 它会改变用户文档,我不想在原始文档中进行任何更改,而是在嵌入的用户文档中进行。
    • @RohitKhatri 不,只需找到您要更改的用户,然后运行更新。
    • 抛出错误mongoengine.errors.InvalidQueryError: Cannot resolve field "roles"
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2015-07-26
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多