在 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 nothing
s 是一个坏主意,因为这会在你的数据库中产生完整性问题(引用一个实际上不存在的对象)。 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
我有一个允许管理员发布文章的文章模型。每篇文章都分配给创建这篇文章的用户。
我想确保所有文章都不会受到影响,即使我删除了这篇特定文章的作者。我选择 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 nothing
s 是一个坏主意,因为这会在你的数据库中产生完整性问题(引用一个实际上不存在的对象)。 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