Django模型ForeignKey on_delete属性:完整意义?

Vit*_*mar 46 django django-models

这里有一些型号:

class UserProfile(models.Model):  
    name = models.CharField(max_length=30)
    email = models.EmailField(unique=True, db_index=True) 
    birthday = models.DateField()

class Photo(models.Model):
    user = models.ForeignKey(UserProfile)
    description = models.TextField(blank=True)
    photo = models.ImageField(upload_to='img/photo')
Run Code Online (Sandbox Code Playgroud)

假设用户有10张照片(10个Photo模型对象).当用户删除自己时,所有这10个Photo数据库行会自动删除吗?(我读过文档,但英语不是我的母语,所以我对该on_delete属性一无所知.)

Chr*_*gan 180

我将通过on_delete适用于此案例的值.正如文档中所述,这些都在该models模块中,因此您将其用作models.ForeignKey(UserProfile, on_delete=models.CASCADE)等等.

这些规则适用于删除对象,无论是在管理面板中执行还是直接使用Model实例.(但是如果直接使用SQL中的底层数据库,它将不会生效.)

  • CASCADE:删除时UserProfile,所有相关的Photos也将被删除.这是默认值.(因此,在回答问题的这一方面时,是的,如果您删除了自己的用户帐户,照片将会自动删除.)

  • PROTECT:这将阻止你删除UserProfile与相关的Photos,django.db.models.ProtectedError如果你尝试,提出一个.这个想法是用户Photo在删除他们的个人资料之前需要取消关联或删除所有s.

  • SET_NULL:删除时UserProfile,所有关联的Photos仍然存在,但不再与任何关联UserProfile.这null=TrueForeignKey定义中是必需的.

  • SET_DEFAULT:删除时UserProfile,所有关联的Photos都将更改为指向定义中属性UserProfile指定的默认值(您可以使用此选项将"孤立"照片传递给某个用户 - 但这不会是共同的,或者会更常见)defaultForeignKeySET_NULLSET()

  • SET():当你删除时UserProfile,Photos' 的目标ForeignKey将被设置为传递给SET函数的值,或者如果它是可调用的,它将返回的值.(对不起,我没有解释得那么好,但是文档有一个更好的解释的例子.)

  • DO_NOTHING:删除时UserProfile,所有相关的Photos将保持不变,因此具有损坏的引用,除非您已使用其他SQL来处理它.

(另外,on_delete这不是一种方法.它是该ForeignKey领域的一个属性.)


sec*_*ond 20

这是默认行为,是的.你可以改变这种行为on_delete

要了解这一点,请尝试删除管理员中的userprofile.它首先显示一个警告页面,列出所有也将被删除的相关对象