Sustie

主页 所有文章 文章检索

Django外键的on_delete参数

在 Django 的 ORM 框架中,通过models.ForeignKey可以很方便地创建外键字段。请看下面的例子:

from django.db import models

class Manufacturer(models.Model):
    name = models.TextField()

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT)

在创建外键的时候,必须指定on_delete参数。在早期的 Django 版本中,这个参数有一个默认值CASCADE,而这个选项是非常危险的。假如数据库中有一些 Car 的 Manufacturer 是 BMW,那么如果设置了CASCADE,删除 BMW 就会将由 BMW 生产的所有 Car 的记录也一并删除,这样很可能导致数据丢失。如果设置为PROTECT,就会拒绝这次删除操作,并抛出一个异常。事实上,在生产环境中,往往很少直接删除记录,最多就是用一个专门的deleted字段来进行伪删除,因此将on_delete设置为PROTECT是我心目中的最佳实践。(on_delete还有一些安全性介于CASCADEPROTECT之间的选项,例如SET_NULLRESTRICT等等,这里就不赘述了。)