【问题标题】:Django foreign keys cascade deleting and "related_name" parameter (bug?)Django外键级联删除和“related_name”参数(错误?)
【发布时间】:2011-02-05 07:37:42
【问题描述】:

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

但是当我们使用带有“related_name”参数的 ForeignKey 字段时,这个方法似乎失败了。 在我看来,“clear()”方法可以正常工作并保存“解除关联”对象的实例。但是,在删除时,django 使用了这个对象的另一个记忆副本,因为它仍然与我们试图删除的对象相关联——哇哦! ...再见亲戚:)

数据库是在我之前构建的,而且方式有点奇怪,所以我无法在合理的时间内逃避这些“related_names”。有人听说过解决此类问题的方法吗?

【问题讨论】:

  • 请注意,在最新版本的 Django 中,人们会使用 on_delete=SET_NULL 而不是这个 hack。

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


【解决方案1】:

如果再次重新读取对象并删除它呢?

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

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

【讨论】:

  • 事实上,这种方法对我有用。我正在使用 Django 1.2(签出稳定分支)。此外,在使用操作(在管理对象列表中,而不是更改表单中)删除对象时记录了它,它未被调用的对象的 delete() 方法,因为它是批量删除 (QuerySet.delete())
  • 谢谢 Mandx,我会试一试。不知道什么时候,因为我的工作超出了这段代码:)
猜你喜欢
  • 2012-09-21
  • 2013-10-29
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多