Каскадное удаление внешних ключей Django и параметр «related_name» (ошибка?) - PullRequest
1 голос
/ 07 апреля 2010

В этой теме Я нашел хороший способ предотвратить каскадное удаление связанных объектов, когда это не нужно.

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

Но этот метод, похоже, не работает, когда мы используем поле ForeignKey с параметром "related_name". Как мне кажется, метод clear () работает нормально и сохраняет экземпляр «деассоциированного» объекта. Но затем, при удалении, django использует еще одну запомненную копию этого самого объекта, и, поскольку он все еще связан с объектом, который мы пытаемся удалить, - whooooosh! ... до свидания родственникам:)

База данных была спроектирована до меня, и несколько странным образом, так что я не могу избежать этих "related_names" в разумные сроки. Кто-нибудь слышал об обходном пути для такой проблемы?

1 Ответ

2 голосов
/ 06 августа 2010

Как насчет перечитать объект еще раз и удалить его?

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

Таким образом, удаляемый объект является новой свежей копией.Проблема состоит в том, чтобы делать все правильно, другие вещи, которые должен делать оригинальный метод delete(), такие как вызов сигнала, возвращать правильное значение и т. Д. *

...