我有一个如下所示的管理操作:
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()
因此,管理员可以处理reservation
一个item
. 每当他这样做时,都会将reservation
其标记为已处理,并且可用items
数量会减少 中指定的数量reservation
。
正如所有管理员操作都会发生的那样,管理员可以reservations
一次处理多个操作。reservations
如果一切都不同,一切都会顺利items
。但是如果两个reservations
共享一个item
,可用的数量items
只会减少最后reservation
处理中指定的数量。
我认为F()
表达式仅适用于这种情况:我想进行许多更改item
并让它们增加或减少属性,item
而不会遇到竞争条件。我错过了什么?