我很熟悉Django,但我最近注意到存在一个on_delete=models。级联选项与模型。我已经搜索了相同的文档,但我找不到更多的东西:

在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做什么?(我猜如果模型被删除了要做的动作。)

什么是模型。级联做什么?(文档中的提示)

还有什么其他的选择(如果我的猜测是正确的)?

这方面的文档放在哪里?


当前回答

假设您有两个模型,一个名为Person,另一个名为Companies。

根据定义,一个人可以创建多家公司。

考虑到一个公司可以有且只能有一个人,我们希望当一个人被删除时,与他相关的所有公司也都被删除。

我们首先创建一个Person模型,像这样

class Person(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.id+self.name

然后,Companies模型看起来像这样

class Companies(models.Model):
    title = models.CharField(max_length=20)
    description=models.CharField(max_length=10)
    person= models.ForeignKey(Person,related_name='persons',on_delete=models.CASCADE)

注意on_delete=models的用法。模型公司中的CASCADE。也就是说,当拥有公司的人(类person的实例)被删除时,删除所有公司。

其他回答

这是你的问题的答案,说:为什么我们使用on_delete?

当一个被ForeignKey引用的对象被删除时,Django默认会模仿SQL约束ON DELETE CASCADE的行为,同时也会删除包含ForeignKey的对象。可以通过指定on_delete参数来重写此行为。例如,如果你有一个可为空的ForeignKey,并且你想在删除引用对象时将它设置为空:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

on_delete的可能值可以在django.db.models中找到:

CASCADE:级联删除;默认值。

PROTECT:通过引发ProtectedError (django.db.IntegrityError的子类)来防止被引用对象的删除。

SET_NULL:设置ForeignKey为空;这只有在null为True时才有可能。

SET_DEFAULT:设置ForeignKey为默认值;必须设置一个默认的ForeignKey。

如前所述,CASCADE将删除具有外键的记录,并引用已删除的另一个对象。例如,如果你有一个房地产网站,有一个引用城市的属性

class City(models.Model):
    # define model fields for a city

class Property(models.Model):
    city = models.ForeignKey(City, on_delete = models.CASCADE)
    # define model fields for a property

现在当城市从数据库中删除时,所有相关的属性(例如。位于该城市的房地产)也将从数据库中删除

现在我还想提一下其他选项的优点,比如SET_NULL或SET_DEFAULT甚至DO_NOTHING。基本上,从管理的角度来看,您希望“删除”这些记录。但你不希望它们消失。原因有很多。有人可能不小心删除了它,或者是为了审计和监控。以及简单的报道。因此,这可能是一种将房产与城市“断开”的方法。同样,这取决于您的应用程序是如何编写的。

For example, some applications have a field "deleted" which is 0 or 1. And all their searches and list views etc, anything that can appear in reports or anywhere the user can access it from the front end, exclude anything that is deleted == 1. However, if you create a custom report or a custom query to pull down a list of records that were deleted and even more so to see when it was last modified (another field) and by whom (i.e. who deleted it and when)..that is very advantageous from the executive standpoint.

不要忘记,对于这些记录,您可以恢复意外删除,只需删除= 0即可。

我的观点是,如果有一个功能,它背后总是有一个原因。这并不总是一个好理由。但是有一个原因。而且通常都是很好的。

使用CASCADE实际上意味着告诉Django删除引用的记录。 当一个“问题”被删除时,它也会删除这个问题的选项。

问:你是怎么知道我们公司的? (选择:1。朋友2。电视广告搜索引擎4。电子邮件推广)

当您删除这个问题时,它也会从表中删除所有这四个选项。 注意它流动的方向。 你不需要输入on_delete=models。问题级联模型把它放在选择中。

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.dateTimeField('date_published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_legth=200)
    votes = models.IntegerField(default=0)

假设您有两个模型,一个名为Person,另一个名为Companies。

根据定义,一个人可以创建多家公司。

考虑到一个公司可以有且只能有一个人,我们希望当一个人被删除时,与他相关的所有公司也都被删除。

我们首先创建一个Person模型,像这样

class Person(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.id+self.name

然后,Companies模型看起来像这样

class Companies(models.Model):
    title = models.CharField(max_length=20)
    description=models.CharField(max_length=10)
    person= models.ForeignKey(Person,related_name='persons',on_delete=models.CASCADE)

注意on_delete=models的用法。模型公司中的CASCADE。也就是说,当拥有公司的人(类person的实例)被删除时,删除所有公司。

删除父对象时删除数据库中的所有子字段,然后使用on_delete,如下所示:

class user(models.Model):
    commodities = models.ForeignKey(commodity, on_delete=models.CASCADE)