PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment éviter les conditions de concurrence dans Django sur INSERT avec SUM limitant ?

Merci à @Alasdair de m'avoir orienté dans la bonne direction.

Après avoir rempli les champs de inst (une nouvelle Expense ), faites :

with transaction.atomic():
    project = models.Project.objects.select_for_update().get(
        pk=project_id)
    cost = project.total_cost()
    budget = project.budget

    if cost + inst.cost > budget:
        raise forms.ValidationError(_('Over-budget'))

    self._inst.save()

Notez que j'ai total_cost défini comme une méthode sur Project :

class Project:
    def total_cost(self):
        return self.expense_set.all().aggregate(
            t=Sum(F('cost')))['t']