Django UtilidadesMarinho Brandão

May/07 01

Deleção em cascata no Django

banco de dados django
Publicado há 1 year, 8 months por Marinho Brandao
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 :)

Links sociais


Comentários


Escreva o seu


.net adoradores ajax android apple banco de dados blogosfera brasil django emprego família gadgets google inovação java linux lua microsoft musica opensocial opinião publicidade python rails religiao screencast seguranca software-livre tdd web windows yadsel

Artigos recentes