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

Я пытаюсь изменить этот файл 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.

Ваша помощь будет оценена по достоинству.


person azio    schedule 10.12.2012    source источник
comment
в какой из этих строк возникает исключение?   -  person John Mee    schedule 10.12.2012


Ответы (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)
person Aidan Ewen    schedule 10.12.2012
comment
Я получаю эту ошибку с вашим кодом: Тип исключения: AttributeError Значение исключения: объект 'int' не имеет атрибута 'delete' Местоположение исключения: /Users/azio/.virtualenvs/proj/lib/python2.7/site-packages/taggit /models.py в after_deleting, строка 172. Исполняемый файл Python: /Users/azio/.virtualenvs/proj/bin/python Версия Python: 2.7.3 - person azio; 10.12.2012
comment
Я боюсь, что вся предпосылка моего ответа была неправильной :( В любом случае, я обновил его - я думаю, что эта версия должна работать нормально. - person Aidan Ewen; 11.12.2012
comment
Версия Django: 1.4.2 Тип исключения: DoesNotExist Значение исключения: Запрос соответствия тегов не существует. Расположение исключения: /Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/db/models/query.py в get, строка 366. Исполняемый файл Python: /Users/user/.virtualenvs/proj/ bin/python Версия Python: 2.7.3 - person azio; 15.12.2012