在 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
还有一些安全性介于CASCADE
和PROTECT
之间的选项,例如SET_NULL
和RESTRICT
等等,这里就不赘述了。)