J'ai une action d'administration qui ressemble à ceci:Django - En utilisant l'expression F(), mais obtenir la mise à jour non atomique
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()
Ainsi, l'administrateur peut traiter un reservation
d'un item
. Chaque fois qu'il le fait, le reservation
est marqué comme étant traité, et le nombre de items
disponible est diminué de la quantité spécifiée dans le reservation
. Comme il arrive pour toutes les actions d'administration, l'administrateur peut traiter plusieurs fois reservations
à la fois. Tout va bien si le reservations
ont tous différents items
. Mais si deux reservations
partagent un item
, le nombre de items
disponibles est seulement diminué de la quantité spécifiée dans le dernier reservation
traité.
Je pensais que F()
expressions étaient juste pour ce cas: je veux faire beaucoup de changements à item
et de les augmenter ou diminuer un attribut sur item
sans courir dans des conditions de course. Qu'est-ce que je rate?
Comment le détectez-vous? Rappelez-vous que vous devez appeler get() pour obtenir la nouvelle valeur ... –
Je regarde la valeur de item.available dans l'admin après le traitement des réservations! :-) – Andrea
Est-ce que les éléments obtiennent 'select_related' dans le jeu de requêtes? – okm