django更新模型,同时保存另一个表格

问题描述:

我正在保存和更新窗体中的另一个模型,但更新没有保存到数据库。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

您在保存方法使用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

我觉得你的问题是关于这里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