django在保存另一个表单时更新模型

时间:2014-11-08 12:44:27

标签: django django-models

我正在保存表单中的另一个模型,但更新不会保存到数据库中。

        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)

2 个答案:

答案 0 :(得分:0)

您在save方法中使用force_update=True。来自文档:

  

在极少数情况下,必须能够强制save()方法执行SQL INSERT而不是回退到执行UPDATE。反之亦然:如果可能,请更新,但不要插入新行。在这些情况下,您可以将force_insert = True或force_update = True参数传递给save()方法。显然,传递这两个参数是一个错误:你不能同时插入和更新!

您是第一次将对象保存到数据库中,因此调用force_update=True没有意义,因为它会阻止首先创建对象。所以改变

item_object.save(force_update=True)

item_object.save()

答案 1 :(得分: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)时会丢失此对象的实例。

这就是为什么你认为你需要强制更新,但实际上你只需要保留对象的正确实例。

为什么不直接更新数据库中的对象上的字段然后保存? 像这样:

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

您甚至不需要强制更新,因为您正在处理从数据库获得的实例。