Как автоматически удалить сущность модели 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()