2014-11-08 73 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) 

任何人都可以請幫助上述代碼中的錯誤,謝謝。

編輯:更新的代碼如下

@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')? – 2014-11-08 12:46:53

+0

表單有效,表單模型對象在提交時成功創建。我會嘗試刪除嘗試....除了,看看我是否得到任何錯誤,謝謝 – user3575232 2014-11-08 13:21:20

+0

嗨,我刪除了嘗試...除了,表單提交成功,但模型沒有更新數據庫。不過,我添加@ transaction.commit_manually,模型保存在數據庫中,但我得到錯誤「事務管理塊結束與懸而未決的COMMIT/ROLLBACK」,任何幫助如何解決此錯誤,嘗試搜索,但沒有解決方案工作,謝謝。 – user3575232 2014-11-08 14:12:32

回答

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裝飾器,但我得到另一個錯誤,謝謝 – user3575232 2014-11-08 14:25:09

0

我覺得你的問題是關於這裏Django的ORM工作。
您從數據庫中獲取對象: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 2014-11-08 19:25:28

+0

你是否也刪除了交易裝飾器? – PhilipGarnero 2014-11-08 19:27:54

+0

是的,我已經刪除了事務修飾符,但是如果我使用transaction.commit_manually修飾符,模型在數據庫中更新,但是在提交 – user3575232 2014-11-08 19:30:39

相關問題