订单Order 与 用户 User 是多对一的关系,Order 表中有User外键 user_id,当你删除一条user数据的时候,与之关联的订单Order记录会受影响,具体根据 on_delete
的值来决定。
class Order(BaseModel):
user= models.ForeignKey(User, on_delete=models.CASCADE)
on_delete 没有默认值,定义的时候必须显示地指定一个值。否则会报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
- CASCADE:级联删除,当你删除user记录时,与之关联的所有 order 都会被删除。
- PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误,也就是说,如果有外键关联,就不允许删除,除非先把关联了外键的记录删除掉。举个例子就是想要删除user,那你要把所有关联了该user的order全部删除才可能删user。
- SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是要设置为 blank=True, null=True。删除user后,order 记录里面的user_id 就置为null了。
- SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
- SET(): 自定义一个值,该值只能是对应的实体
- DO_NOTHING:Django啥事也不做,你要删就删吧,你的外键值我依然给你保留,但是你要是去做关联查询肯定是查不到了,比如 删除 user后,order 里面的 user_id 依然在,只是再也找不到 user_id 对应的是哪个user了,因为你把他删掉了。
其实 DO_NOTHING
对应的是数据库中的NO_ACTION
操作。
关注公众号「Python之禅」,回复「1024」免费获取Python资源