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

时间:2011-12-17 09:40:03

标签: 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')

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

2 个答案:

答案 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定义中的}}属性(您可以使用此属性将“孤立”照片传递给特定用户 - 但这不常见,defaultForeignKey将更常见的事情)

  • SET_NULL:当您删除SET()时,SET() s'UserProfile的目标将设置为传递给{{{ 1}}函数,或者如果它是可调用的则返回它。 (对不起,我没有解释得那么好,但是docs有一个更好的解释的例子。)

  • Photo:当您删除ForeignKey时,所有相关的SET将保持不变,因此引用中断,除非您使用了其他一些SQL来保护它的。

(另外,DO_NOTHING不是方法。它是UserProfile字段的属性。)

答案 1 :(得分:18)

这是默认行为,是的。您可以使用on_delete

更改此行为

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