【问题标题】:Django models ForeignKey on_delete attribute: full meaning?Django模型ForeignKey on_delete属性:完整含义?
【发布时间】:2012-01-22 13:16:21
【问题描述】:

这里有一些模型:

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 属性一无所知。)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我将介绍适用于这种情况的 on_delete 的值。正如它在文档中指出的那样,这些都在 models 模块中,因此您可以将其用作 models.ForeignKey(UserProfile, on_delete=models.CASCADE) 等。

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

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

    • PROTECT:这将阻止您删除具有相关Photos 的UserProfile,如果您尝试,则会引发django.db.models.ProtectedError。这个想法是,用户需要先取消关联或删除所有Photos,然后才能删除他们的个人资料。

    • SET_NULL:当您删除 UserProfile 时,所有关联的 Photos 仍将存在,但将不再与任何 UserProfile 关联。这将需要 null=TrueForeignKey 定义中。

    • SET_DEFAULT:当您删除 UserProfile 时,所有关联的 Photos 将更改为指向它们的默认 UserProfile,如 default 定义中的 default 属性所指定的ForeignKey (您可以使用它来将“孤立”照片传递给某个用户 - 但这并不常见,SET_NULLSET() 会更常见)

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

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

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

    【讨论】:

    • 我尝试了 CASCADE,但是当我删除照片时,用户配置文件被删除,当我尝试删除照片时我尝试保护它引发错误。我想知道这是否是 on_delete 属性对关系另一端的副作用。特别是对于 PROTECT,如果出现 Protected 错误,如何删除所有照片以便删除 UserProfile?
    【解决方案2】:

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

    要对此进行说明,请尝试在管理员中删除用户配置文件。它首先显示一个警告页面,列出所有将被删除的相关对象

    【讨论】:

    • 我不想改变这种行为——我需要它!如果不是从管理面板删除用户,而是从命令行删除用户,效果会一样吗?
    • 效果是一样的。但是请注意,默认情况下,存储在 Photo.photo 中的实际文件将不会被删除
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2016-02-18
    • 2012-11-15
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    相关资源
    最近更新 更多