2016-06-23 5 views
0

Метода from_json из mongoengineModelClass используется для:Невозможно сохранить существующую модель экземпляр, созданный с помощью метода _from_json

Преобразования JSON данных в несохраненный экземпляр документа

Если я отправить на сервере JSON с некоторыми изменили поля и попытались конвертировать в несохраненный экземпляр документа, они не отслеживают _changed_fields в модели, например _changed_fields всегда пуст.

data = self.request.data # json representation of object 
model_instance = SomeModel.from_json() 
print(model_instance._changed_fields) # get empty list 

Как я знаю .save метод ModelInstance только сэкономить измененные поля и проверить его в _changed_fields собственности. Поэтому, если это свойство всегда пустое - невозможно сохранить экземпляр модели, созданный с помощью метода from_json.

Вопрос - как я могу сохранить экземпляр модели, созданный из json?

ответ

1

Разве вы не можете это сделать?

data = self.request.data 
model_instance = SomeModel(**data) 
print(model_instance._changed_fields) # should not be empty 
model_instance.save() # should work 

Пояснения:

В питона, если функция или класс принимает аргументы (аргументы) и именованные аргументы (kwargs), можно заполнить их соответственно список/кортеж (my_list) и словарь (my_dict).

Требования:

  • Список/кортеж должен иметь столько же элементов, как количество позиционных аргументов
  • Словарь может иметь много ключей/значений, которые мы хотим, , но только те, согласующих именованные аргументы будут сопоставлены.

Пример:

def foo(a, b, c=None, d=1): 
    pass 

class Foo(object): 
    def __init__(self, a, b, c=None, d=1): 
     pass 

my_list = [1, 2] 
my_dict = {'c': 3, 'd': 4} 

вы можете сделать:

test = foo(*my_list, **my_dict) 

или

obj = Foo(*my_list, **my_dict) 

Я надеюсь, что это помогает.

+0

Btw, этот вопрос для mongoengine, а не стандартный Django ORM. Проблема - '.save()' метод dont actualy SAVE model (например, im описать на мой вопрос) Это происходит cuz '.save()' метод сохранять только измененные поля и отслеживать эти изменения с помощью атрибута _changed_fields' в модели. И да, я могу просто перейти к созданию модели ** kwargs, но в этом случае я не могу разыменовать ReferenceField. В вашем примере _changed_fields не будет пустым в любое время (если вы измените его или нет), если вы попытаетесь сохранить модель с эталонным полем в ней. –