1

如果我想添加一个具有默认值的新字段,我在创建几个文档后使用 Django rest framework mongoengine。有什么办法可以做到这一点,否则我需要用很少的自定义功能进行更新。

注意:我想使用具有新字段名称的过滤器来获取数据。那个时候领域不存在。所以我越来越空了。

4

1 回答 1

1

据我了解,您正在插入文档后修改 MongoEngine 模型(添加具有默认值的字段)。在该新字段上过滤您的收藏时,您遇到了问题。

基本上你有以下令人困惑的情况:

from mongoengine import *

conn = connect()

conn.test.test_person.insert({'age': 5})    # Simulate an old object

class TestPerson(Document):
    name = StringField(default='John')    # the new field
    age = IntField()

person = TestPerson.objects().first()

assert person.name == "John" 
assert Test.objects(name='John').count() == 0

事实上,当底层 pymongo 文档的字段为空时,MongoEngine 会动态应用默认值,但在过滤时并没有考虑到这一点。

保证过滤有效的唯一可靠方法是迁移现有文档。如果它只添加一个具有默认值的字段,您可以使用 MongoEngine 执行此操作:TestPerson.objects().update(name='John')

如果您对文档结构进行了更重要/更复杂的更改,那么最好的选择是使用 pymongo。

coll = TestPerson._get_collection()
coll.update({}, {'$set': {'name': 'John'}})
于 2019-09-26T20:03:59.407 回答