【问题标题】:Django models: how to avoid cascade deletesDjango 模型:如何避免级联删除
【发布时间】:2013-01-17 11:23:34
【问题描述】:

我有一个关于设计 Django 模型和考虑对级联删除的影响的一般性问题。假设一个资产管理应用程序的以下简单设计。

class Asset(models.Model):
    aquire_date = models.DateField()
    cost = models.DecimalField(max_digits=16, decimal_places=2)
    description = models.CharField(max_length=30)
    account = models.ForeignKey(Account)
    vendor = models.ForeignKey(Vendor)
    department = models.ForeignKey(Department)

class Vendor(models.Model):
    name = models.CharField(max_length=70)
    city = models.CharField(max_length=50
    phone = PhoneNumberField()
    email = models.EmailField()

class Account(models.Model):
    account_number = models.IntegerField()
    description = models.CharField(max_length=50)

class Department(models.Model):
    number = models.IntegerField(unique=True)
    name = models.CharField(max_length=50)

所以每个 Asset 都有 3 个 ForeignKey 字段到其他表。阅读Django documentation 它说“任何具有指向要删除的对象的外键的对象都将被删除”。我读到这意味着如果我删除一个 Department 对象、Asset 对象或对象,ForeignKey 所指的对象也将被删除。但如果我删除资产,部门、供应商和帐户仍然存在。

这是理解 Django 中级联删除的正确方法吗?

我更喜欢的是

  • 删除资产时,不会删除任何部门、供应商或帐户;
  • 删除部门时,不会删除任何资产,但指向该部门的所有 ForeignKey 字段都设置为空。

这可能吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    是的,你的理解是正确的。

    解决方案:当creating a model ForeignKey field 时,提供on_delete=django.db.models.SET_NULL。您需要将其与null=True 结合使用以允许这样做,因为默认值为False

    【讨论】:

    • 菲尔,谢谢你的回答!那行得通!我认为您写答案的速度比我创建问题的速度要快。有时你知道自己想做什么,只是很难在 Django 文档中找到它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2019-04-17
    • 2019-12-30
    • 2011-03-04
    相关资源
    最近更新 更多