Dans this topic J'ai trouvé un bon moyen d'empêcher la suppression en cascade d'objets liés, quand ce n'est pas nécessaire.Suppression en cascade de clés étrangères Django et paramètre "related_name" (bug?)
class Factures(models.Model):
idFacture = models.IntegerField(primary_key=True)
idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)
class Paiements(models.Model):
idPaiement = models.IntegerField(primary_key=True)
idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)
class Lettrage(models.Model):
idLettrage = models.IntegerField(primary_key=True)
def delete(self):
"""Dettaches factures and paiements from current lettre before deleting"""
self.factures_set.clear()
self.paiements_set.clear()
super(Lettrage, self).delete()
Mais cette méthode semble échouer lorsque nous utilisons le champ ForeignKey avec le paramètre "related_name". Comme il me semble, la méthode "clear()" fonctionne bien et enregistre l'instance de l'objet "désassocié". Mais alors, tout en supprimant, django utilise une autre copie mémorisée de cet objet même et comme il est toujours associé à un objet, nous essayons de supprimer - whooooosh! ... bye-bye à des parents :)
Base de données a été arcitectured avant moi, et de manière un peu étrange, donc je ne peux pas échapper à ces "related_names" dans un laps de temps raisonnable. Quelqu'un a entendu parler de solution de contournement pour un tel problème?
Notez que dans les versions récentes de Django, on utiliserait 'on_delete = SET_NULL' au lieu de ce hack. – bouke