如何使用 Django 中同一个表的多个外键来管理删除?

Posted

技术标签:

【中文标题】如何使用 Django 中同一个表的多个外键来管理删除?【英文标题】:how do I manage deletion with multiple foreign keys to the same table in Django? 【发布时间】:2022-01-22 12:02:10 【问题描述】:

假设我有一个模型,其中包含一个事物表和一个名为 ThingRelations 的事物之间的关系表。当存在指向事物的事物关系时,应该不可能删除事物。这就是我尝试实现的方式:

from django.db import models

class ThingRelation(models.Model):
    first_thing = models.ForeignKey('Thing', on_delete=models.PROTECT)
    second_thing = models.ForeignKey('Thing', on_delete=models.PROTECT)

class Thing(models.Model):
    name = CharField(max_length=260)

当没有更多 ThingRelations 指向某个事物时,如何自动删除它?

【问题讨论】:

您可以尝试创建一个post_delete 信号接收器,然后检查要删除的模型是否是 ThingRelation,如果是,是否有任何其他 ThingRelations 指向相关事物。如果没有,请删除该事物。 【参考方案1】:

你有这样的选择:

例行程序。它可以做成Commandcrontab 之类的东西。或者它可以设计为periodiq 例程。这样你就可以重复选择所有与ThingRelation没有关系的Thing模型。 signals.py 行动。这样当ThingRelation的条目被删除时,您应该同时检查first_thingsecond_thing,以了解是否有更多的ThingRelation关系指向它们。 数据库触发器(例如PostgreSQL)。与signal.py 解决方案的想法相同,但在数据库级别。

你应该选择哪一个?取决于您的确切目标的详细信息。至于我,我在简单情况下使用periodiq 选项,如果我的目标是高性能,则使用数据库触发器。

【讨论】:

以上是关于如何使用 Django 中同一个表的多个外键来管理删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何在课堂上设置两个外键? DJANGO ORM

Django的管理页面怎么显示和过滤另外一个表的字段,非外键

Django模型:如何避免在使用来自同一个表的2个外键时引用相同的记录

Django 模型中的有序列表

django:如何从包含外键的多个模型中制作一个表单

基于唯一键的Django加盟模式