当前位置: 首页 > 面试题库 >

on_delete对Django模型有什么作用?

狄新翰
2023-03-14
问题内容

我对Django非常熟悉,但是最近发现on_delete=models.CASCADE模型中存在一个选项,我在文档中搜索了相同的选项,但找不到以下内容:

在Django 1.9中进行了更改:

on_delete现在可以用作第二个位置参数(以前通常只作为关键字参数传递)。在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是做什么的?(我想如果删除html" target="_blank">模型,要执行的操作)

怎么models.CASCADE办?(文档中的任何提示)

还有其他可用的选项(如果我的猜测是正确的)?

有关此文档的位置在哪里?


问题答案:

这是删除引用对象时采取的行为。它不是特定于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:这可能是一个非常糟糕的主意,因为这会在数据库中创建完整性问题(引用实际上不存在的对象)。SQL等效项:NO ACTION

例如,另请参阅PostGreSQL文档。

在大多数情况下,这CASCADE是预期的行为,但是对于每个ForeignKey,你应始终问自己在这种情况下的预期行为是什么。PROTECT并且SET_NULL通常很有用。设置CASCADE不应该设置的位置,可以通过简单地删除单个用户来级联删除所有数据库。

附加说明以阐明级联方向

有趣的是,注意到CASCADE行动的方向对于许多人来说并不明确。事实上,这很有趣地看到,只有该CASCADE行动并不清楚。我知道级联行为可能会造成混淆,但是你必须认为它与任何其他动作是同一方向。因此,如果你觉得自己CASCADE不清楚方向,那实际上意味着on_delete你不清楚自己的行为。

在你的数据库中,外键基本上由一个整数字段表示,该值是外对象的主键。假设你有一个comment_A条目,该条目具有一个article_B条目的外键。如果你删除条目comment_A,那么一切都很好,article_B以前可以不带有comment_A生存,并且也不会被删除。但是,如果删除article_B,则comment_A会慌!它永远都离不开article_B并需要它,它是它属性的一部分(article=article_B,但是 article_B * ???)。这是on_delete确定如何解决此完整性错误的步骤,或者说:

  • “No! Please! Don’t! I can’t live without you!” (which is said PROTECT in SQL language)
  • “Alright, if I’m not yours, then I’m nobody’s” (which is said SET_NULL)
  • “Good bye world, I can’t live without article_B” and commit suicide (this is the CASCADE behavior).
  • “It’s OK, I’ve got spare lover, I’ll reference article_C from now” (SET_DEFAULT, or even SET(…)).
  • “I can’t face reality, I’ll keep calling your name even if that’s the only thing left to me!” (DO_NOTHING)

我希望它使级联方向更清晰。:)



 类似资料:
  • 我对Django非常熟悉,但最近我注意到在模型上有一个 现在可以用作第二个位置参数(以前它通常只作为关键字参数传递)。它将是Django 2.0中的必需参数。 使用的一个例子是: on_delete做什么?(我猜删除模型后要执行的操作。) 做什么?(文档中的任何提示) 还有什么其他选择(如果我的猜测是正确的)? 这方面的文档存放在哪里?

  • 我对Django非常熟悉,但最近注意到在_delete=models上存在一个和选项, > 我已搜索了相同的文档,但除了以下内容外,找不到其他内容: Django 2.0 多对一的关系。需要两个位置参数:与模型相关的类和on_delete选项。要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self',on_delete=models.CASCADE)

  • 我想修改一个外键值,当它从数据库中删除。所以我看了医生,用on_delete=模型。SET(foo)方法.https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.SET 这是我的模型定义 这是我的方法,被称为删除 然而这里的问题是,我不能将参数传递给这个方法,这就是为什么我不能知道删除了哪个产品。我还试着在

  • 在django模型中使用“on_delete=models.CASCADE”时会发生什么

  • 本文向大家介绍泛型有什么作用?相关面试题,主要包含被问及泛型有什么作用?时的应答技巧和注意事项,需要的朋友参考一下 泛型有什么作用? 作者:rottenpen

  • 问题内容: 我只是好奇是否有人知道django的orm有什么理由不在模型上调用“full\u clean”,除非它被保存为模型表单的一部分。 请注意,调用模型的save()方法时,不会自动调用full\ u clean()。当您要为自己手动创建的模型运行一步模型验证时,需要手动调用它。django完全干净的医生 (注:Django 1.6的报价已更新。。。以前的django文档也对ModelFor