May/07
01
Deleção em cascata no Django
Não é preciso ter um modelo muito complexo para se experimentar a necessidade de "CASCADE DELETE" ou "CASCADE UPDATE". Quando isso já é controlado pelo SGBD, podemos despreocupar, mas o ideal é trazer todo tipo de complexidade de regras de negócio para as camadas de modelo e/ou controle.
Quando uma classe do modelo possui atributos do tipo ManyToManyField, não precisa se preocupar, pois o ORM do Django já efetua a deleção em cascata de forma encapsulada, mas e quando é um caso semelhante a este abaixo?
class Cliente(models.Model):
nome = models.CharField(maxlength=50)
def atendimentos(request):
return Atendimento.objects.filter(cliente=self)
class Atendimento(models.Model):
cliente = models.ForeignKey(Cliente)
bom, a solução é sobrepor o método de deleção por um que exclua os Atendimentos antes que a exclusão do Cliente seja efetuada, assim:
class Cliente(models.Model):
nome = models.CharField(maxlength=50)
def atendimentos(request):
return Atendimento.objects.filter(cliente=self)
def delete(request, *args, **kwargs):
Atendimento.objects.filter(cliente=self).delete()
super(Cliente, self).delete(*args, **kwargs)
Quando se usa "*args, **kwargs", você garante qualquer parametro passado, e quando se chama o método sobreposto com "super(Cliente, self).__init__(*args, **kwargs)" você está repassando estes parâmetros, sejam lá quais forem.
Assim, sua deleção em cascata está resolvida, sem delongas e sem ter que apelar para o banco de dados :)
Marinho Brandão