Удаление тегов, которые не используются другими объектами
Я пытаюсь изменить этот файл https://github.com/alex/django-taggit/blob/master/taggit/models.py так, чтобы когда тег не был связан с каким-либо другим объектом, он был удален.
Вот что я добавил в конец файла:
# ---
# Delete the tags that are not used by any other object
from django.db.models.signals import post_delete
def after_deleting(sender, instance, **kwargs):
if TaggedItem.objects.filter(tag=instance.tag_id).count() == 0:
print "Deleting tag", instance
t = Tag.objects.get(pk=instance.tag_id)
t.delete()
post_delete.connect(after_deleting, sender=TaggedItem)
Это не работает, как ожидалось. Когда я запускаю, выдает эту ошибку:
Exception Type: DoesNotExist
Exception Value: Tag matching query does not exist.
Ваша помощь будет оценена.
1 ответ
Решение
Я не думаю, что вы должны использовать instance.tag_id
в фильтре. Попробуйте просто использовать instance.tag
, Тогда при поиске объекта тега вы можете заменить -
t = Tag.objects.get(pk=instance.tag_id)
с -
t = instance.tag
Добавление _id к полю является ярлыком для получения первичного ключа объекта. Так instance.tag
является объектом тега и instance.tag_id
является первичным ключом объекта тега.
Все это было бы более кратким -
# Delete the tags that are not used by any other object
from django.db.models.signals import post_delete
def after_deleting(sender, instance, **kwargs):
if not TaggedItem.objects.filter(tag=instance.tag):
print "Deleting tag", instance
instance.tag.delete()
post_delete.connect(after_deleting, sender=TaggedItem)