Django外键级联删除和“related_name”参数(错误?)

时间:2010-04-07 15:05:17

标签: django django-models foreign-key-relationship cascading-deletes

this topic中,我找到了一种防止关联对象级联删除的好方法,当它不是必需的时候。

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()”方法工作正常,并保存“deassociated”对象的实例。但是,在删除时,django使用了这个对象的另一个记忆副本,因为它仍然与我们试图删除的对象相关联 - whooooosh! ...再见亲戚:)

数据库在我之前被架构,并且以某种奇怪的方式,所以我无法在合理的时间内逃避这些“related_names”。有人听说过这样的麻烦的解决办法吗?

1 个答案:

答案 0 :(得分:2)

如何重新读取对象并删除它?

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

这种方式是删除的对象是一个新的新副本。问题是要正确地完成原始delete()方法必须做的所有事情,比如信号调用,返回正确的值等等......