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