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,您应该始终问自己在这种情况下预期的行为是什么。 PROTECTSET_NULL通常是有用的。 在不应该设置CASCADE下,可以通过简单地删除一个用户来删除级联中的所有数据库。

on_delete方法用于告诉Django如何处理取决于您删除的模型实例的模型实例。 (例如一个ForeignKey关系)。 on_delete=models.CASCADE告诉Django级联删除效果,即继续删除依赖模型。

这是一个更具体的例子。 假设您在Book模型中有一个作为ForeignKeyAuthor模型。 现在,如果删除了Author模型的一个实例,Django将不知道如何处理依赖于Author模型实例的Book模型的实例。 on_delete方法告诉Django在这种情况下要做什么。 设置on_delete=models.CASCADE将指示Django级联删除效果,即删除所有依赖于删除的Author模型实例的Book模型实例。

注意: on_delete将在Django 2.0中成为必需的参数。 在较早的版本中,它默认为CASCADE

这是整个官方文档。