4

このファイル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.

あなたの助けをいただければ幸いです。

4

1 に答える 1

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)
于 2012-12-10T07:31:55.033 に答える