如何使用 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】:你有这样的选择:
例行程序。它可以做成Command
和crontab
之类的东西。或者它可以设计为periodiq
例程。这样你就可以重复选择所有与ThingRelation
没有关系的Thing
模型。
signals.py
行动。这样当ThingRelation
的条目被删除时,您应该同时检查first_thing
和second_thing
,以了解是否有更多的ThingRelation
关系指向它们。
数据库触发器(例如PostgreSQL)。与signal.py
解决方案的想法相同,但在数据库级别。
你应该选择哪一个?取决于您的确切目标的详细信息。至于我,我在简单情况下使用periodiq
选项,如果我的目标是高性能,则使用数据库触发器。
【讨论】:
以上是关于如何使用 Django 中同一个表的多个外键来管理删除?的主要内容,如果未能解决你的问题,请参考以下文章
Django的管理页面怎么显示和过滤另外一个表的字段,非外键