【问题标题】:Django DB design for deleting crucial models?用于删除关键模型的 Django DB 设计?
【发布时间】:2020-11-05 09:20:31
【问题描述】:

我遇到了一个我以前真的没有处理过的问题。我有一个从 django 1 ==> 2 升级的任务。(django 1 在处理关系时不需要 on_delete)

我有几个关键模型内部有关系,但我绝对不想 CASCADE 那些记录。例如,如果用户删除了他们的帐户,我不希望删除他们的费用。也许我们需要保留这些费用实例以供以后税务记录等使用。

我了解到 DO_NOTHING 也可能很危险。

对于这样的模型,在处理 ForeignKeys 时最好的做法是什么?

提前感谢所有帮助。

class Expenses(models.Model):

    user = models.ForeignKey(Account, null=True, blank=True, 
                             on_delete=models.?)
    event = models.ForeignKey(Event, null=True, blank=True, 
                             on_delete=models.?)
    payee = models.CharField(max_length=128, null=True, blank=True)
    category = models.ForeignKey(Category, blank=True, null=True,
                                related_name='expense_category', on_delete=models.?)

【问题讨论】:

  • 如果仍然有引用它的东西,您可以使用.PROTECT 来防止删除模型。
  • 如果你在 Django-1.x 中没有指定这个,那么它需要CASCADE,所以实际上你已经使用了级联。

标签: django django-models django-database


【解决方案1】:

我有一个从 django 1 升级到 2 的任务。(django 1 在处理关系时不需要on_delete

中,如果你没有指定on_delete,它使用CASCADE [Django-doc],所以实际上通过指定它,你可以让它更安全。

我了解到DO_NOTHING 也可能很危险。

大多数数据库会为此引发完整性错误,因为那时它将引用不再存在的用户。所以DO_NOTHING 本身并不危险,它只是对于大多数数据库不允许删除数据库,而是通过提高IntegrityError

对于这样的模型,处理ForeignKeys 时最好的做法是什么?

也许这里PROTECT [Django-doc] 更合适,因为如果它仍然被引用,它只会阻止删除该对象。

然而,最好的解决方案取决于大量的细节。因此,最好查看可能的on_delete=… strategies [Django-doc]

【讨论】:

  • 感谢您的详尽解释!帮了我很多忙。我认为使用 PROTECT 将是一个不错的选择,然后当用户实际删除诸如“费用”记录之类的内容时,可能会实施软删除。
  • @Jmast:你可以看看django-soft-delete或者其他包,让软删除更方便。
猜你喜欢
  • 2018-04-22
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2016-06-07
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多