当由一个 ForeignKey 引用的对象被删除,默认情况下,Django模拟SQL的 ON DELETE CASCADE 来删除对象的 ForeignKey 关系。这样可以覆盖指定的 on_delete 参数。比如,你有一个可为空的 ForeignKey ,你想他引用的对象被删除时,该项为空。
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
django.db.models 中的 on_delete 存在以下设置值:
CASCADE
级联删除默认值。
PROTECT
阻止删除 django.db.IntegrityError 的子类 ProtectedError 引用的对象。
SET_NULL
设置 ForeignKey 为空。只有 null 为 True 时才可设置。
SET_DEFAULT
设置 ForeignKey 的默认值,而且必须得设置。
SET()
设置 ForeignKey 的值传递给 SET() ,并允许可调用的对象调用它。大多数情况下通过调用是必要的,这样可以避免执行查询时models.py被导入。
def get_sentinel_user():
return User.objects.get_or_create(username='deleted')[0] class MyModel(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
DO_NOTHING
不采取任何行动。如果你的数据库后端强制引用完整性,这将导致 IntegrityError 错误,除非手动添加SQL数据库中的 ON DELETE 字段进行约束。