【Django】Django-taggitをUUIDに対応させる

Django

スポンサーリンク

Django-taggitはそのままではuuidのモデルには対応していません。

taggit_taggeditemテーブルは以下のようになっています。

object_idにuuidとしているpkの値が入るのですが、object_idはinteger型なので、

このままタグ追加すると、以下のようなエラーになります。

DataError: integer out of range

対処方法としてはtaggit_taggeditemテーブルではなく、uuid用のtaggit_taggeditemテーブルを新たに作る感じです。

以下、ソース。必要な修正部分のソースのみ載せています。

[models.py]

from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase, TagBase

# taggit_taggeditemテーブルの代わりにUUIDTaggedItemテーブルを作る
class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
    """
    UUIDをpkとしているmodelをdjango-taggitに対応させる
    """
    class Meta:
        verbose_name = ("Tag")
        verbose_name_plural = ("Tags")


class Foo(models.Model): 
    # 各種フィールド定義
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    # through=UUIDTaggedItemでUUIDTaggedItemテーブルに保存されるようにする
    tags = TaggableManager(through=UUIDTaggedItem, blank=True)

こうすることで、「UUIDTaggedItem」テーブルができて、object_idがuuid型となります。

Django

Posted by ton