2014-11-08 3 views
0

Я сохраняю и обновляю другую модель в форме, но обновление не сохраняется в базе данных.Модель обновления django при сохранении другой формы

 if request.method == 'POST': 
     form = InventoryTransactionForm(request.POST, instance=InventoryTransaction()) 
     if form.is_valid():     
      quantity = request.POST['quantity'] 
      part_id = request.POST['part_id'] 
      item_template_id = request.POST['supply'] 
      try: 
       item_object = Item.objects.get(pk=part_id) 
       masterQty = item_object.masterQty - int(quantity) 
       item_object.save(force_update=True) 
      except Exception, e:      
       messages.error(request, e.message) 

Может кто-нибудь, пожалуйста, помогите, что не так в приведенном выше коде, спасибо.

EDIT: обновленный код, как показано ниже

@transaction.commit_manually 
    def post(self, request, *args, **kwargs): 
     if request.method == 'POST': 
      form = InventoryTransactionForm(request.POST, instance=InventoryTransaction()) 
      if form.is_valid(): 

       quantity = request.POST['quantity'] 
       part_id = request.POST['part_id'] 
       item_template_id = request.POST['supply'] 
       try: 
        item_object = Item.objects.get(pk=part_id) 
        masterQty = item_object.masterQty - int(quantity) 

      item_object.save(force_update=True) 
        transaction.commit() 
       except Exception, e:      
        transaction.rollback() 
        messages.error(request, e.message) 

      form.save(True) 
+0

Вы удалили 'try ... except', чтобы узнать, возникает ли исключение? Является ли форма определенно действительной (т. Е. 'If form.is_valid()' на самом деле 'True')? –

+0

Форма действительна, объект модели формы успешно создается при представлении. Я попытаюсь удалить try .... за исключением и посмотреть, если я получаю какую-либо ошибку, спасибо – user3575232

+0

Привет, я удалил try ... кроме того, форма отправляется успешно, но модель не обновляется в базе данных. Однако я добавил @ transaction.commit_manually, модель сохраняется в базе данных, но я получаю сообщение об ошибке «Управляемый блок транзакций завершен с ожиданием COMMIT/ROLLBACK», любая помощь в том, как разрешить эту ошибку, попыталась выполнить поиск, но ни одно из решений не сработало, спасибо , – user3575232

ответ

0

Вы используете force_update=True в методе сохранения. Из документов:

In some rare circumstances, it’s necessary to be able to force the save() method to perform an SQL INSERT and not fall back to doing an UPDATE. Or vice-versa: update, if possible, but not insert a new row. In these cases you can pass the force_insert=True or force_update=True parameters to the save() method. Obviously, passing both parameters is an error: you cannot both insert and update at the same time!

Вы сохраняете объект в базу данных в первый раз, так что не имеет смысла называть force_update=True, как это будет препятствовать объект от создается в первую очередь. Меняем

item_object.save(force_update=True) 

в

item_object.save() 
+0

Привет Я создаю объект формы, т.е. InventoryTransaction и обновляющий item_object, который существует в базе данных. Посмотрите мой обновленный код. Он обновляется, когда я использую @ transaction.commit_manually decorator, но получаю еще одну ошибку: – user3575232

0

Я думаю, ваша проблема заключается в работе с Джанго ОРМ здесь.
Вы получаете свой объект из базы данных здесь: item_object = Item.objects.get(pk=part_id), но вы теряете экземпляр этого объекта при выполнении item_object = Item(masterQty=masterQty, item_template_id=item_template_id, id=part_id).

Вот почему вы считаете, что вам требуется обновление силы, но вам просто нужно сохранить правильный экземпляр вашего объекта.

Почему бы вам не просто обновить поля на объекте, который вы получили от db, а затем сохранить его?
Как так:

item_object = Item.objects.get(pk=part_id) 
item_object.masterQty -= int(quantity) 
item_object.item_template_id = item_template_id 
item_object.save() 

Вам не нужно даже обновление силы, как вы будете работать на примере вы получили из БД.

+0

извините, проигнорируйте эту строку, я пытался решить какое-то решение, забыл удалить эту строку. Я попробовал, но объект не обновляется. Запрос «запрос {u'time»: u'0.001 ', u'sql': u'QUERY = u \ 'UPDATE "parts_item" SET "item_template_id" =% s, "masterQty" =% s WHERE "parts_item". «id» =% s \ '- PARAMS = (2, 9976, 2)'} "показывает обновленный ibut, не передан ли он в базе данных? – user3575232

+0

Вы также удалили декоратор транзакций? – PhilipGarnero

+0

Да, я удалил обработчик транзакций, но если я использую обработчик transaction.commit_manually, модель обновляется в базе данных, но я получаю TransactionManagementError на перезагрузке страницы после фиксации. – user3575232

Смежные вопросы