【问题标题】:Django: How to make admin not delete the relative objects?Django:如何让管理员不删除相关对象?
【发布时间】:2016-08-06 01:28:04
【问题描述】:

在管理界面中删除对象时,我想防止删除相关对象。

class ObjectToDelete(models.Model):
    timestamp = models.DateTimeField()

class RelatedObject(models.Model):
    otd = models.ForeignKey('app.ObjectToDelete', null=True, blank=True)

由于RelatedObject 中的ForeignKey 可以为空,我应该可以将其设置为None,而不是删除整个对象。这正是我想要的行为。

我知道我可以为此管理界面创建自定义删除操作。

而且我也知道我可以在ObjectToDelete 中创建ManyToManyField,这也将阻止删除RelatedObject。但是那样我就没有我想要的一对多关系了。

有没有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    为您的外键设置on_delete 选项。如果要在删除相关对象时将值设置为None,请使用SET_NULL

    models.ForeignKey('app.ObjectToDelete', on_delete=models.SET_NULL)
    

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

    【讨论】:

    • 在您的示例中使用SET_NULL 而不是CASCADE 可能会更好,因为OP 不希望删除相关对象。
    • @Alasdair,是的,你是对的,我们可以在这里使用 SET_NULL。但就性能而言,两者都在数据库级别,不能确定谁更快。
    • 这不是关于哪个更快。使用models.CASCADE(Django 2.0 之前的默认行为)删除相关对象。这正是 OP 试图避免的。
    • @Alasdair 请编辑答案,表明SET_NULL 是我想要的。所以我可以接受。谢谢
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2021-05-28
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多