on_delete在Django模型上做了什么?
我对Django非常熟悉,但是最近注意到on_delete=models.CASCADE
存在on_delete=models.CASCADE
选项,我search了相同的文档,但找不到更多,
在Django 1.9中更改:
现在可以使用
on_delete
作为第二个位置参数(以前它通常只作为关键字parameter passing)。 这将是在Django 2.0中的一个必需的参数。
用法的一个例子是
from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass
on_delete是做什么的? ( 如果模型被删除,猜测要完成的动作 )
model.CASCADE做什么? ( 文档中的任何提示 )
还有什么其他的select( 如果我的猜测是正确的 )?
这个文件在哪里?
这是删除引用对象时要采用的行为。 它不是特定于Django,这是一个SQL标准。
发生此类事件时,可能会采取以下6种措施:
-
CASCADE
:当被引用的对象被删除时,也删除引用它的对象(例如当你删除一个博客文章,你可能也想删除注释)。 等价的SQL:CASCADE
。 -
PROTECT
:禁止删除引用的对象。 要删除它,您将不得不删除手动引用它的所有对象。 等价的SQL:RESTRICT
。 -
SET_NULL
:将引用设置为NULL(要求该字段为空)。 例如,当你删除一个用户时,你可能想保留他发表在博客文章上的评论,但是说它是由一个匿名(或删除的)用户发布的。 等价的SQL:SET NULL
。 -
SET_DEFAULT
:设置默认值。 等价的SQL:SET DEFAULT
。 -
SET(...)
:设定一个给定的值。 这不是SQL标准的一部分,完全由Django处理。 -
DO_NOTHING
:可能是一个非常糟糕的主意,因为这会在数据库中创build完整性问题(引用实际上不存在的对象)。 等价的SQL:NO ACTION
。
来源: Django文档
另请参阅PostGreSQL的文档 。
在大多数情况下, CASCADE
是预期的行为,但对于每个ForeignKey,您应该始终问自己在这种情况下预期的行为是什么。 PROTECT
和SET_NULL
通常是有用的。 在不应该设置CASCADE
下,可以通过简单地删除一个用户来删除级联中的所有数据库。
on_delete
方法用于告诉Django如何处理取决于您删除的模型实例的模型实例。 (例如一个ForeignKey
关系)。 on_delete=models.CASCADE
告诉Django级联删除效果,即继续删除依赖模型。
这是一个更具体的例子。 假设您在Book
模型中有一个作为ForeignKey
的Author
模型。 现在,如果删除了Author
模型的一个实例,Django将不知道如何处理依赖于Author
模型实例的Book
模型的实例。 on_delete
方法告诉Django在这种情况下要做什么。 设置on_delete=models.CASCADE
将指示Django级联删除效果,即删除所有依赖于删除的Author
模型实例的Book
模型实例。
注意: on_delete
将在Django 2.0中成为必需的参数。 在较早的版本中,它默认为CASCADE
。
这是整个官方文档。