Как автоматически удалить сущность модели Django Many-to-Many, когда у нее больше нет связей?

У меня есть две модели, Record и Tag. Они имеют отношения "многие-ко-многим". Tags также имеет отношения "многие-ко-многим" с третьей моделью, Set.

Я использую Django Rest Framework и сериализатор модели для Tag выглядит следующим образом:

class TagSerializer(serializers.ModelSerializer):
    usage_count = serializers.IntegerField(
        source="record_set.count", read_only=True)

    class Meta:
        model = Tag
        fields = ("name", "usage_count")

Теперь я хочу добиться того, чтобы как только usage_count становится 0, т.е. Tag больше не связан ни с одним Record, он автоматически удалялся.

Единственный надежный подход, который я смог придумать - это cronjob, который проверяет Теги с такими критериями и удаляет их, поскольку ни casecades, ни какие-либо "крючки" удаления, похоже, не помогают.

Есть ли способ достичь этого с помощью более элегантного подхода, чем cronjob?

Вы можете добавить эту логику в модель Tag:

class Tag(models.MOdel):
   # example of your fields..
   name = models.CharField(max_length=128)
   record = models.ManyToManyField(Record)

   def __str__(self):
      return str(self.name)

   def save(self, *args, **kwargs):
      # example...

      if self.record.exists():
          # delete object if there 
          # - is no record.
          self.delete()
      else:
          return super(Tag, self).save(*args, **kwargs)

Использование сигналов:


from django.dispatch import receiver
from django.db.models.signals import post_save

__all__ = ['check_delete_condition']

@receiver(post_save, sender="yourapp.Tag")
def check_delete_condition(instance, raw, created, using, updatefields, **kwargs):
    if instance.record.exists():
        instance.record.delete()
Вернуться на верх