1. ホーム
  2. django

[解決済み] Django のモデルで UUID を主キーとして使う (一般的な関係への影響)

2022-11-18 09:18:13

質問

様々な理由から^、私の Django モデルのいくつかで主キーとして UUID を使いたいと思っています。そうすると、 "contrib.comments" や "django-voting" や "django-tagging" など、 ContentType による一般的な関係を使う外部アプリはまだ使えるでしょうか?

"django-voting" を例として、Vote モデルは以下のようになります。

class Vote(models.Model):
    user         = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id    = models.PositiveIntegerField()
    object       = generic.GenericForeignKey('content_type', 'object_id')
    vote         = models.SmallIntegerField(choices=SCORES)

このアプリは、投票対象のモデルの主キーが整数であると想定しているようです。

組み込みのコメントアプリは、非整数のPKを扱うことができるようですが。

class BaseCommentAbstractModel(models.Model):
    content_type   = models.ForeignKey(ContentType,
            verbose_name=_('content type'),
            related_name="content_type_set_for_%(class)s")
    object_pk      = models.TextField(_('object ID'))
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")

この "integer-PK-assumed" 問題は、UUID を使用するのが面倒なサード パーティ製アプリによくある状況でしょうか。それとも、もしかしたら、私がこの状況を誤解しているのでしょうか?

Django で、あまり問題を起こさずに UUID を主キーとして使用する方法はあるでしょうか?


^ いくつかの理由は、オブジェクト数の隠蔽、URL "IDクローリングの防止、競合しないオブジェクトを作成するための複数サーバーの使用、などです。

どのように解決するのですか?

UUID主キーは、一般的な関係だけでなく、一般的な効率の問題を引き起こします。すべての外部キーは、保存と結合の両方において、マシン語よりもかなり高価になります。

しかし、何もUUIDを主キーにする必要はありません。 セカンダリ を持つ uuid フィールドでモデルを補完することで、キーにすればよいのです。 unique=True . 暗黙の主キーを通常通り (システム内部で) 使用し、UUID を外部識別子として使用します。