这里有一些模特:
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张照片(10个Photo
模型对象)。当用户删除自己时,所有这10个Photo
数据库行会自动删除吗? (我读过文档,但英语不是我的母语,所以我对on_delete
属性的所有内容都不了解。)
答案 0 :(得分:174)
我会查看on_delete
的值,因为它们适用于此案例。正如文档中所述,这些都在models
模块中,因此您将其用作models.ForeignKey(UserProfile, on_delete=models.CASCADE)
等。
这些规则适用于删除对象,无论是在管理面板中执行还是直接使用Model
实例。 (但是如果直接使用SQL中的底层数据库,它将不会生效。)
CASCADE
:当您删除UserProfile
时,所有相关的Photo
也将被删除。这是默认值。 (因此,在回答问题的这一方面时,是的,如果您删除了自己的用户帐户,照片将会自动删除。)
PROTECT
:如果您尝试,这将阻止您删除带有相关UserProfile
的{{1}},并提出Photo
。我们的想法是,用户需要取消关联或删除所有django.db.models.ProtectedError
,然后才能删除其个人资料。
Photo
:当您删除SET_NULL
时,所有关联的UserProfile
仍然存在但不再与任何Photo
相关联。这需要UserProfile
定义中的null=True
。
ForeignKey
:当您删除SET_DEFAULT
时,所有关联的UserProfile
都将更改为指向{{1}指定的默认Photo
UserProfile
定义中的}}属性(您可以使用此属性将“孤立”照片传递给特定用户 - 但这不常见,default
或ForeignKey
将更常见的事情)
SET_NULL
:当您删除SET()
时,SET()
s'UserProfile
的目标将设置为传递给{{{ 1}}函数,或者如果它是可调用的则返回它。 (对不起,我没有解释得那么好,但是docs有一个更好的解释的例子。)
Photo
:当您删除ForeignKey
时,所有相关的SET
将保持不变,因此引用中断,除非您使用了其他一些SQL来保护它的。
(另外,DO_NOTHING
不是方法。它是UserProfile
字段的属性。)
答案 1 :(得分:18)
这是默认行为,是的。您可以使用on_delete
要了解此情况,请尝试删除管理员中的userprofile。它首先显示一个警告页面,列出所有也将被删除的相关对象