在 Django 应用程序中使用什么 on_delete 选项?

what on_delete option to use in django app?

我有一个允许管理员发布文章的文章模型。每篇文章都分配给创建这篇文章的用户。

我想确保所有文章都不会受到影响,即使我删除了这篇特定文章的作者。我选择 on_delete=models.DO_NOTHING 以确保除用户帐户外不会删除任何内容,但我不太确定这是最有效的方法。

class Article(models.Model):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(User, blank=True, null=True, on_delete=models.DO_NOTHING)
    title = models.CharField('Title', max_length=70, help_text='max 70 characters')
    body = models.TextField('Description')

问题

我应该使用其他选项还是 DO_NOTHING 就足够了。显然对我来说最重要的是作者的名字在删除后会在文章中可见,并且文章本身无法删除。

基本上,数据库 table 在某些 table 中创建记录并存储用户信息,正如我所看到的,您正在根据用户模型将文章模型与用户链接起来。

可能有两种情况,例如,如果您希望文章保留在数据库中,即使您删除了作者,您也会在文章显示在某处时获得文章。

如果您执行 Cascade 删除操作,当相关作者被删除时,它会删除文章记录。

如果您这样做 models.Protect,您将无法在删除用户后删除文章。

来到你的 models.Do nothings 是一个坏主意,因为这会在你的数据库中产生完整性问题(引用一个实际上不存在的对象)。 SQL 等效:无操作

找到更多

我能说的最多的是:

添加另一个名为 author_name 的字段。

现在将作者的 on_delete 设置为 models.SET_NULL

添加自定义保存方法以将您的用户名添加到 author_name

为名为 author_full_name 的模型添加 属性 在此 属性 检查作者是否为空 return 用户名和姓氏。 如果作者是 None return author_name.

这样当文章被保存时用户全名被保存在author_name。如果用户被删除,您可以使用 author_name。 但要注意自定义保存方法,如果您不检查用户并删除它,它可能会增加一些问题。


编辑:另一个解决方案

如果您有自定义用户模型,您可以为您的用户创建一个名为 is_deleted 的字段。

在您的用户删除他们的帐户后,只需将此字段设置为 True,并在您的应用中使用逻辑来排除已删除的帐户。

这样,任何人都无法访问您的用户,但您可以将它们用于文章和外键。 (记得告诉你的用户删除帐户的方法是这样的,或者设置一个任务在一段时间后删除帐户并设置我上面说的字段。)

你只需要使用 CASCADE 如下: on_delete=models.CASCADE