【发布时间】:2012-05-23 05:15:48
【问题描述】:
我有一个如下所示的管理操作:
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 上的属性,而不会遇到竞争条件。我错过了什么?
【问题讨论】:
-
你是如何检测到这个的?请记住,您必须调用 get() 才能获取新值...
-
处理完预订后,我正在查看管理中 item.available 的值! :-)
-
项目是否在预订查询集中获得
select_related? -
为什么不
Item.objects.filter(reservation=reservation).update(F('available') - reservation.quantity)? -
@ilvar
reservation有一个指向item的外键,而不是相反
标签: python django django-models race-condition