【问题标题】:Django: keep log after deleting a foreignkeyDjango:删除外键后保留日志
【发布时间】:2020-04-09 21:12:29
【问题描述】:

我的问题很简单: 我有一个文件夹模型,我有一个日志模型。以下是简化示例:

class Folder(models.Model):
    name = models.CharField(max_length=100)

class Log(models.Model):
    folder = models.ForeignKey(Folder, on_delete="I NEED HELP HERE")

这意味着,文件夹是由用户创建的,并且对文件夹执行的每个操作都使用日志模型(用户编辑的文件夹,用户对文件夹执行此操作等...)进行记录

我想做的很简单:如果某个管理员完全删除了该文件夹,我仍想保留该文件夹的名称。 on_delete 属性中的所有操作,不要让我这样做。

有什么想法吗?

PS:那些不是真正的模型,只是我想要做的一个说明。真正的是100多行代码:P

【问题讨论】:

  • 您可以例如使用SET_NULL。或者您可能想要“软删除”该文件夹。

标签: django django-models foreign-keys


【解决方案1】:

我想我找到了答案,我所做的只是设置一个默认值,然后放入 on_delete=models.SET_DEFAULT。

默认值是从函数返回的变量,在模型正上方声明,获取用户名并将其存储在不同的表中。

【讨论】:

    【解决方案2】:

    您可以实现自己的on_delete 触发器,因为on_delete 只需要一个可调用对象,如果它所引用的对象被删除,则会调用该可调用对象:Django 会自己触发管理。但这可能只会让它变得更加复杂。

    我认为将Folder 设为“软删除”模型可能会更好。在这里,如果您删除模型,它不会从数据库中删除,但数据库有一个带有布尔值的列,用于指定记录是否“已删除”。如果它被删除,它通常不会包含在模型上的标准查询集中,但仍然有办法获取它所引用的项目。此外,您以后可以通过“取消删除”来恢复已删除的对象。例如,您可以使用django-softdelete package [GitHub]

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2014-07-09
      • 2018-12-30
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多