Как управлять удалением с несколькими внешними ключами к одной и той же таблице в Django?

Допустим, у меня есть модель с таблицей Things и таблицей отношений между вещами ThingRelations. Не должно быть возможности удалить вещь, если есть 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?

У вас есть такие варианты:

  • Рутина. Она может быть выполнена как Command и что-то вроде crontab. Или это может быть оформлено как periodiq рутина. Таким образом, можно многократно выбирать все Thing модели, которые не имеют отношений с ThingRelation.
  • signals.py действия. Таким образом, когда запись ThingRelation будет удалена, вы должны проверить оба first_thing и second_thing, чтобы знать, есть ли у них еще отношения ThingRelation, указывающие на них.
  • Триггер БД (например, для PostgreSQL). Та же идея, что и в решении signal.py, но на уровне БД.

Какой из них выбрать? Зависит от деталей вашей точной цели. Что касается меня, я использую вариант periodiq в простых случаях и DB-триггер, если я нацелен на высокую производительность.

Вернуться на верх