Как управлять удалением с несколькими внешними ключами к одной и той же таблице в 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-триггер, если я нацелен на высокую производительность.