这个答案的内容在“重复的问题”中提供,尽管这比在那里提供的任何答案都要详细得多。
仅供参考,模型中的on_delete参数是从它听起来的后退。您将“on_delete”放在模型上的外键(FK)上,告诉django如果删除了您在记录中指向的FK条目该怎么做。我们商店最常用的选项是PROTECT,CASCADE和SET_NULL。以下是我发现的基本规则:
这是一个完成所有三件事的模型示例:
class PurchPurchaseAccount(models.Model):
id = models.AutoField(primary_key=True)
purchase = models.ForeignKey(PurchPurchase, null=True, db_column='purchase', blank=True, on_delete=models.CASCADE) # If "parent" rec gone, delete "child" rec!!!
paid_from_acct = models.ForeignKey(PurchPaidFromAcct, null=True, db_column='paid_from_acct', blank=True, on_delete=models.PROTECT) # Disallow lookup deletion & do not delete this rec.
_updated = models.DateTimeField()
_updatedby = models.ForeignKey(Person, null=True, db_column='_updatedby', blank=True, related_name='acctupdated_by', on_delete=models.SET_NULL) # Person records shouldn't be deleted, but if they are, preserve this PurchPurchaseAccount entry, and just set this person to null.
def __unicode__(self):
return str(self.paid_from_acct.display)
class Meta:
db_table = u'purch_purchase_account'
作为最后的消息,您是否知道如果您不指定on_delete(或没有),则默认行为是CASCADE?这意味着,如果有人在您的性别表中删除了性别条目,那么任何具有该性别的人员记录也会被删除!
我会说,“如果有疑问,请设置on_delete = models.PROTECT。”然后去测试你的应用程序。您将很快找出哪些FK应该标记其他值而不会危及您的任何数据。
另外,值得注意的是on_delete = CASCADE实际上没有添加到任何迁移中,如果这是您选择的行为。我想这是因为它是默认值,所以把on_delete = CASCADE与什么都不做是一回事。