【django】modelの自動採番をuuidや任意のidに変更

djangomodels.Modelで作成されたクラスは特に記載が無ければ、1.2.3のような自動採番形式になります。

任意のコードや、セキュリティを考慮してuuidなどを設定する方法をご紹介します。

目次

models.pyの編集

サンプルとして下記のようなクラスを作成しました。

frfrom django.db import models

class Task(models.Model):

    status_choices = (
        ("1","未着手"),
        ("2", "作成中"),
        ("3", "完了"),
    )
    name = models.CharField(max_length=255)
    status = models.CharField(max_length=20, choices=status_choices)

「名前」と「ステータス」しか持たないシンプルなものです。

idをuuidに変更

自動採番AutoFieldを用いず、uuidを使用する場合にはUUIDFieldを使用します。
また、uuidをインポートしておきます。

primary_key=True

主キーなのでTrueを指定

default=uuid.uuid4

データーベース保存の際に、ランダムに入ります。

editable=False

プライマリーキーを変更されたら困るのでFalseにする

from django.db import models
import uuid

class Task(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    status_choices = (
        ("1","未着手"),
        ("2", "作成中"),
        ("3", "完了"),
    )
    name = models.CharField(max_length=255)
    status = models.CharField(max_length=20, choices=status_choices)

これだけで、完了です!

uuidを使用するメリットは

  • idからデータベースのレコード数を推測されない
  • 数字のみだと適当なレコードが発見される
  • uuidが一意性を持つ

などの点が挙げられます。

任意のコードに変更

利用シーンとしては、もともと別のシステム上でデータを管理していてidがある場合などは、そのままそのidを使用したい場合などでしょうか。

uuidの時と同様にフィールドに、primary_key=Trueを設定し、作成後にidを編集されたくないのでeditable=Falseにします。

おまけで、任意のidにはバリデーションとして英数字のみを受け付ける形式にしてみました。

from django.db import models
from django.core.validators import RegexValidator

alphanumeric = RegexValidator(
    r'^[0-9a-zA-Z]*$', 'Only alphanumeric characters are allowed.')

class Product(models.Model):

    id = models.CharField(primary_key=True, editable=False,
                          validators=[alphanumeric])
    name = models.CharField(max_length=255)

便利です。

参考

Model field reference | Django documentation | Django

Django-モデルのプライマリキーをUUIDにする | Hodalog

Django学習におすすめの教材

Django 記事一覧

Django

初期設定
モデルの作成(models.py)
デプロイ

Django REST framework

設定
Serializer

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる