我很熟悉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做什么?(我猜如果模型被删除了要做的动作。)
什么是模型。级联做什么?(文档中的提示)
还有什么其他的选择(如果我的猜测是正确的)?
这方面的文档放在哪里?
这是你的问题的答案,说:为什么我们使用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实际上意味着告诉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?
当一个被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。