2016-09-27 32 views
0

我想在将文档嵌入到其他文档之前将其他属性添加到文档中,但我不知道该怎么做。如何在不更改原始模型的情况下向嵌入式文档添加其他字段

这里是我的代码和我所到目前为止已经试过:

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 = User.objects.create(name='Rohit Khatri') 
user.roles = ['admin','writer'] 

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

但它不会添加的角色领域,这将是感激,如果有人可以帮助我。

感谢

回答

1

使用更新方法来设置新的属性

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

它将改变用户的文档,我不想使原来的文档中的任何改变,但在嵌入式用户文件。 –

+0

@RohitKhatri不,只需找到想要更改的用户,然后运行更新即可。 – armak

+0

它引发错误'mongoengine.errors.InvalidQueryError:无法解析字段“角色” –

相关问题