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

这里有一些模型:

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') 

假设用户有10张照片( Photo模型的10个对象)。 当用户删除自己将所有这10个Photo数据库行自动删除自己? (我读过文档,但英文不是我的母语,所以我不了解关于on_delete属性的所有信息。)

这是默认行为,是的。 你可以用on_delete来改变这个行为

为了得到这个插图,请尝试删除pipe理员中的用户configuration文件。 它首先显示一个警告页面,列出所有相关对象也将被删除

我将通过on_delete的值来适用于这种情况。 正如它在文档中提到的,这些都在models模块中,所以你可以使用它作为models.ForeignKey(UserProfile, on_delete=models.CASCADE)

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

  • CASCADE :当您删除UserProfile ,所有相关Photo也将被删除。 这是默认的。 (所以在回答你的问题的方面,是的,如果你删除你的用户帐户照片将被自动删除。)

  • PROTECT :这将阻止你删除一个UserProfile与相关的Photo ,如果你尝试引发django.db.models.ProtectedError 。 这个想法是,用户需要在删除所有Photo之前,先取消关联或删除Photo

  • SET_NULL :当您删除UserProfile ,所有相关Photo将仍然存在,但将不再与任何UserProfile相关联。 这将需要在ForeignKey定义中为null=True

  • SET_DEFAULT :当你删除UserProfile ,所有相关的Photo都将被改变为指向它们的默认UserProfile ,由ForeignKey定义中的default属性指定(你可以使用这个来将“孤立”的照片传递给某个用户 – 但是这个不会很普遍, SET_NULLSET()会更常见)

  • SET() :当你删除UserProfilePhoto的' ForeignKey '的目标将被设置为传递给SET函数的值,或者如果它是可调用的,则返回它的值。 (对不起,我没有解释清楚,但是文档有个例子可以更好的解释。)

  • DO_NOTHING :当你删除UserProfile ,所有相关的Photo都将保持不变,因此有一个引用错误,除非你已经使用其他一些SQL来处理它。

(另外, on_delete不是一个方法,它是ForeignKey字段的一个属性。)