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_NULL
或SET()
会更常见) -
SET()
:当你删除UserProfile
,Photo
的'ForeignKey
'的目标将被设置为传递给SET
函数的值,或者如果它是可调用的,则返回它的值。 (对不起,我没有解释清楚,但是文档有个例子可以更好的解释。) -
DO_NOTHING
:当你删除UserProfile
,所有相关的Photo
都将保持不变,因此有一个引用错误,除非你已经使用其他一些SQL来处理它。
(另外, on_delete
不是一个方法,它是ForeignKey
字段的一个属性。)