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)
您在保存方法使用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()
您好我正在创建表单对象,即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()
你甚至都不需要强制更新,你会在你从数据库中得到了一个实例来工作。
抱歉忽略该行,我想一些解决方案忘记删除该行。我仍然试着对象不更新。查询“查询{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
你是否也删除了交易装饰器? – PhilipGarnero 2014-11-08 19:27:54
是的,我已经删除了事务修饰符,但是如果我使用transaction.commit_manually修饰符,模型在数据库中更新,但是在提交 – user3575232 2014-11-08 19:30:39
您是否删除了'try ... except'以查看是否引发了异常?该形式是否有效(即'if form.is_valid()'实际上是否为'True')? – 2014-11-08 12:46:53
表单有效,表单模型对象在提交时成功创建。我会尝试删除尝试....除了,看看我是否得到任何错误,谢谢 – user3575232 2014-11-08 13:21:20
嗨,我删除了尝试...除了,表单提交成功,但模型没有更新数据库。不过,我添加@ transaction.commit_manually,模型保存在数据库中,但我得到错误“事务管理块结束与悬而未决的COMMIT/ROLLBACK”,任何帮助如何解决此错误,尝试搜索,但没有解决方案工作,谢谢。 – user3575232 2014-11-08 14:12:32