DjangoのmodelでUUIDFieldを使う方法。

2021年9月20日Djangoの豆知識

DjangoにはUUIDFieldがあるが、今回はこれを実践的に使う方法について考察する。

UUIDとは

UUIDとは32文字のほぼ確実にかぶらない文字列のことだ。PythonでUUIDを生成できる記事があるのでこちらで体験してみると理解できるはず。( https://jp.magicode.io/sumiso_codb8c/articles/86c40fcdf4fb4f7396ca0dc0c72bbd04 )

とくに設定しない場合Djangoのモデルは id というカラムが自動でついており、1, 2, 3, 4というようにカウントアップされる。

しかし、このidを使ってアプリケーションを公開すると、サービスに関する情報、例えばユーザー数などがわかってしまいます。( もしあなたがそのサービスに登録して、idが23,310だったら2万人ちょっとのユーザー数ということが想像できますよね )

そんな時に出てくるのがUUIDです。ランダムな文字列であることからそのようなことがなくなります。

UUIDFieldの使い方

UUIDFieldはこのように使います。

import uuid
from django.db import models

class YourModel(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    # 以下略

大事なところはprimary_key=Trueとするところです。そうしないとidが自動でふられてしまいます。

応用:抽象的なモデルを作ってしまおう

ここから少し発展です。あなたのサービスで、uuidを使いたいとなったらほかのモデルでもuuidを設定すると思います。

また、作成日時(=created_at)や更新日時(=updated_at)もよく使うのでこの際まとめたいですね。

そんなときには抽象モデルを作成し、それを継承すると楽です。

import uuid

from django.db import models

class AbstractModel(models.Model):
    """ これが抽象モデル """
    class Meta:
        abstract = True

    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class YourUserModel(AbstractModel):
    """ これが作りたいモデル """
    name = models.CharField(max_length=10) # あなたが追加したいカラム

大事なところはabstract = Trueとするところです。これをTrueとすることでmakemigrationsしたときに抽象モデルのマイグレーションファイルが作成されてしまうことを避けられます。

こうすることで、AbstractModelをあらゆるモデルで使い回すことができますね!