gpt4 book ai didi

python - on_delete 对 Django 模型有什么作用?

转载 作者:IT老高 更新时间:2023-10-28 12:11:55 25 4
gpt4 key购买 nike

我对 Django 非常熟悉,但我最近注意到存在一个 on_delete=models.CASCADE与模型选项。我已经搜索了相同的文档,但除了以下内容之外我什么也找不到:

Changed in Django 1.9:

on_delete can now be used as the second positional argument (previously it was typically only passed as a keyword argument). It will be a required argument in Django 2.0.


An example case of usage is :
from django.db import models

class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer',
on_delete=models.CASCADE,
)
# ...

class Manufacturer(models.Model):
# ...
pass
on_delete 有什么作用? (我猜如果模型被删除了要执行的操作。)
什么 models.CASCADE做? (文档中的任何提示)
还有哪些其他选项可用(如果我的猜测是正确的)?
这方面的文档在哪里?

最佳答案

这是删除引用对象时要采用的行为。它不是 Django 特有的;这是一个 SQL 标准。尽管 Django 在 SQL 之上有自己的实现。 (1)
发生此类事件时,可以采取七种可能的操作:

  • CASCADE :当引用的对象被删除时,也删除引用它的对象(例如,当您删除博客文章时,您可能还想删除评论)。 SQL 等效项:CASCADE .
  • PROTECT : 禁止删除引用的对象。要删除它,您必须手动删除所有引用它的对象。 SQL 等效项:RESTRICT .
  • RESTRICT :(在 Django 3.1 中引入)与 PROTECT 类似的行为匹配 SQL 的 RESTRICT更精确地。 (见 django documentation example)
  • SET_NULL : 将引用设置为 NULL(要求该字段可以为空)。例如,当您删除一个用户时,您可能希望保留他在博客帖子上发表的评论,但假设它是由匿名(或已删除)用户发表的。 SQL 等效项:SET NULL .
  • SET_DEFAULT :设置默认值。 SQL 等效项:SET DEFAULT .
  • SET(...) : 设置给定值。这不是 SQL 标准的一部分,完全由 Django 处理。
  • DO_NOTHING :可能是一个非常糟糕的主意,因为这会在您的数据库中造成完整性问题(引用一个实际上不存在的对象)。 SQL 等效项:NO ACTION . (2)

  • 来源: Django documentation
    另见 the documentation of PostgreSQL例如。
    大多数情况下, CASCADE是预期的行为,但是对于每个外键,您应该始终问自己在这种情况下的预期行为是什么。 PROTECTSET_NULL经常有用。设置 CASCADE在不应该的地方,可以通过简单地删除单个用户来潜在地级联删除所有数据库。

    澄清级联方向的附加说明
    有趣的是注意到 CASCADE 的方向许多人不清楚行动。实际上,注意到 很有趣。只有 CASCADE Action 不清楚。我知道级联行为可能会令人困惑,但是您必须认为 它与任何其他 Action 的方向相同 .因此,如果您觉得 CASCADE方向你不清楚,实际上意味着 on_delete你的行为不清楚。
    在您的数据库中,外键基本上由一个整数字段表示,该字段的值是外对象的主键。假设您有一个条目 评论_A ,它有一个条目的外键 文章_B .如果您删除条目 评论_A , 一切顺利。 文章_B 以前没有生活过 评论_A 如果它被删除了,不要打扰。但是,如果删除 文章_B ,然后 评论_A panic !它从来没有离开过 文章_B 并且需要它,它是其属性的一部分( article=article_B ,但什么是 article_B ???)。这是哪里 on_delete介入,以确定如何解决此完整性错误,或者说:
  • “不!求求你!不要!没有你我​​活不下去!” (在 Django/SQL 中被称为 PROTECTRESTRICT)
  • “好吧,如果我不是你的,那我就是别人的”(也就是 SET_NULL)
  • “再见世界,我不能没有文章_B”并自杀(这是CASCADE行为)。
  • “没关系,我有空余情人,我从现在开始引用文章_C”( SET_DEFAULT ,甚至 SET(...) )。
  • “我无法面对现实,我会一直呼唤你的名字,即使这是我唯一的事!” ( DO_NOTHING )

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

    脚注

    (1) Django has its own implementation on top of SQL. And, as mentioned by @JoeMjr2 in the comments below, Django will not create the SQL constraints. If you want the constraints to be ensured by your database (for instance, if your database is used by another application, or if you hang in the database console from time to time), you might want to set the related constraints manually yourself. There is an open ticket to add support for database-level on delete constrains in Django.


    (2) Actually, there is one case where DO_NOTHING can be useful: If you want to skip Django's implementation and implement the constraint yourself at the database-level.

    关于python - on_delete 对 Django 模型有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38388423/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com