我有一个关于设计 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)
因此,每个资产都有 3 个指向其他表的外键字段。 阅读 Django 文档时,它说"任何具有外键指向要删除的对象的对象都将随之删除"。 我的意思是,如果我删除一个部门对象,资产对象或外键所指的对象也将被删除。 但是,如果我删除资产,部门、供应商和帐户将保留。
这是理解 Django 中级联删除的正确方法吗?
我更喜欢的是
- 删除资产时,不会删除任何部门、供应商或帐户; 删除部门
- 时,不会删除任何资产,但指向该部门的所有"外键"字段都设置为 null。
这可能吗?
是的,你的理解是正确的。
解决方案:在字段ForeignKey
创建模型时,供应on_delete=django.db.models.SET_NULL
.您需要将其与null=True
结合使用才能允许此操作,因为默认值为 False
.