【问题标题】:how do I manage deletion with multiple foreign keys to the same table in Django?如何使用 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 指向相关事物。如果没有,请删除该事物。

标签: python python-3.x django database


【解决方案1】:

你有这样的选择:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2016-12-23
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多