代码之家  ›  专栏  ›  技术社区  ›  Adrian

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

  •  0
  • Adrian  · 技术社区  · 4 年前

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

    我想确保即使我删除了这篇文章的作者,所有的文章都不会被触动。我选择了 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')
    

    问题

    我应该使用另一个选项来使用还是什么都不做就足够了。显然,对我来说最重要的是,作者的名字将在删除后的文章中可见,文章本身不能删除。

    0 回复  |  直到 4 年前
        1
  •  1
  •   Mojtaba    4 年前

    我只能说:

    添加另一个名为 author_name .

    现在设置 on_delete 您的作者 models.SET_NULL .

    添加自定义保存方法以将用户名添加到 作者姓名 .

    向模型中添加名为 author_full_name 在此属性中,检查author是否为null,返回用户名和姓氏。 如果作者是 None 回来 作者姓名 .

    这样,当文章保存时,用户全名保存在author\u name上。如果用户被删除,您可以使用 作者姓名 . 但是要注意自定义保存方法,如果不检查用户和它的删除,它可能会添加一些问题。


    编辑:另一个解决方案

    如果你有一个自定义的用户模型,你可以给你的用户一个名为 is_deleted .

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

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

        2
  •  1
  •   lord stock    4 年前

    基本上,数据库表在某些表中创建记录并存储用户信息,因为我可以看到您正在基于用户模型将文章模型与用户链接。

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

    如果你这样做了 Cascade 删除当关联作者被删除时,删除文章记录。

    如果你这样做了 models.Protect 当用户被删除时,您将无法访问删除文章。

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

    查找更多信息 here.

        3
  •  0
  •   Reza Asgharian    4 年前

    您只需要按如下方式使用级联: on_delete=模型。级联