Удаление тегов, которые не используются другими объектами

Я пытаюсь изменить этот файл 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)
Другие вопросы по тегам