模型实例上的save()不更新相关模型侧的更改字段

时间:2013-12-06 05:39:24

标签: django django-models

我的模特:

class InventoryItem(models.Model):
    quantity = models.IntegerField()
    ...

class Requisition(models.Model):
    from_inventoryitem = models.ForeignKey(InventoryItem)
    quantity = models.IntegerField()
    ...

假设请购单与下面的inventory_item有一个OneToMany关系,而inventory_item.quantity的初始值为0,当我执行时:

>>> requisition = Requisition.objects.get(id=1)
>>> requisition.from_inventoryitem.quantity = 500
>>> requisition.save()

>>> requisition.from_inventoryitem.quantity
500
>>> inventory_item.quantity
0

>>> requisition.from_inventoryitem == inventory_item
True

数据库和InventoryItem方面的inventory_item.quantity仍为0。 如何将更改更新到数据库?

1 个答案:

答案 0 :(得分:2)

这是设计的。您必须单独保存每个实例。 requisition.from_inventoryitem实际上是从数据库中查询InventoryItem实例,只是为了设置数量。

requisition = Requisition.objects.get(id=1)
requisition.from_inventoryitem.quantity = 500 # this generates another query here!
requisition.from_inventoryitem.save()

甚至更好,使用单个查询,单个保存

inv_item = InventoryItem.objects.get(requisition_set__id=1)
inv_item.quantity = 500
inv_item.save()

最好的方式。单个数据库调用:

InventoryItem.objects.filter(requisition_set__id=1).update(quantity=500)