Django rest framework mongoengine обновляет новое поле со значением по умолчанию - PullRequest
1 голос
/ 26 сентября 2019

Я использую Django rest framework mongoengine после создания нескольких документов, если я хочу добавить новое поле со значением по умолчанию.Есть ли способ сделать это orelse, мне нужно обновить с несколькими пользовательскими функциями.

Примечание: я хочу получить данные с фильтром, имеющим новое имя поля.На этот раз поле не там.Так что я опустошаюсь.

1 Ответ

1 голос
/ 26 сентября 2019

Насколько я понимаю, вы модифицируете модель 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

Фактически, MongoEngine динамически применяет значение по умолчанию, когда полележащий в основе документ pymongo пуст, но он не учитывает это при фильтрации.

Единственный надежный способ гарантировать, что фильтрация будет работать, - это перенести существующие документы.Если добавляется только поле со значением по умолчанию, вы можете сделать это с помощью MongoEngine: TestPerson.objects().update(name='John')

Если вы сделали более важные / сложные изменения в структуре документа, то лучший вариант - перейти к pymongo..

coll = TestPerson._get_collection()
coll.update({}, {'$set': {'name': 'John'}})
...