Pregunta

En este tema he encontrado una buena manera de evitar el borrado en cascada de los objetos relacionados, cuando no es necesario.

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()

Sin embargo, este método parece fallar cuando estamos usando el campo ForeignKey con el parámetro "related_name". Como me parece, "claro ()" método funciona bien y guarda la instancia de "deassociated" objeto. Pero entonces, si bien la supresión, Django usa otra copia de esta memorizada objeto mismo y ya que todavía está asociado con objetos que están tratando de eliminar - whooooosh! ... adiós a los familiares:)

base de datos se arcitectured delante de mí, y en forma un tanto extraña, así que no puedo escapar de estas "related_names" en tiempo razonable. Alguien oyó hablar de una solución para tales problemas?

¿Fue útil?

Solución

¿Qué hay de volver a leer el objeto de nuevo y borrar eso?

to_delete = self.__class__.objects.get(pk=self.pk)
to_delete.delete()

De esta manera es el objeto eliminado es una nueva copia nueva. El problema es hacer todo correctamente otras cosas que el método delete() original tiene que hacer, como señal de llamada, devuelva el valor correcto, etc ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top