我有一个管理员操作,长这样:
def process(modeladmin, request, queryset):
for reservation in queryset:
if not reservation.processed:
reservation.processed = True
reservation.save()
item = reservation.item
item.available = F('available') - reservation.quantity
item.save()
因此,管理员可以处理“预订”某个“物品”的请求。每当管理员这么做时,“预订”都会被标记为已处理,并且可用的“物品”数量将减少预订中指定的数量。
与所有管理员操作相同,如果管理员同时处理多个“预订”,那么一切都会顺利进行,只要这些“预订”拥有不同的“物品”。但是,如果两个“预订”共享一个“物品”,则可用的“物品”数量仅会减少最后一个被处理的“预订”中指定的数量。
我认为`F()`表达式就是为了解决这个问题:我想对“物品”进行多次更改并使它们增加或减少“物品”的属性,而不会遇到竞争条件。我错过了什么?
Item.objects.filter(reservation=reservation).update(F('available') - reservation.quantity)
? - ilvarreservation
的外键指向item
,而不是反过来。 - Andreaupdate(F('available') - reservation.quantity)
就可以工作。 - FallenAngel