PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como evitar a condição de corrida no Django em INSERT com SUM limitante?


Obrigado a @Alasdair por me apontar na direção certa.

Após preencher os campos de inst (uma nova Expense ), Faz:
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()

Observe que tenho total_cost definido como um método em Project :
class Project:
    def total_cost(self):
        return self.expense_set.all().aggregate(
            t=Sum(F('cost')))['t']