
Django · Model Field · IntegerField の上限値
数値を扱う Django モデルで IntegerField を何気なく使っていると、想定より大きな値を保存しようとしたタイミングで DataError や OverflowError に遭遇します。実は IntegerField には DB 側の型に基づく 上限値(2,147,483,647) が存在し、それを超えるなら BigIntegerField や PositiveBigIntegerField を使う必要があります。本記事では各 Integer 系フィールドの上限値・使い分け・選び方を一覧で整理します。
この記事では、DjangoのIntegerFieldモデルフィールドの上限値に関する注意点についてのまとめ記事です。
一般的にDjangoで数値型のモデルフィールドを定義する場合はIntegerFieldを使うと思います。
以下のような簡単な製品マスターテーブルを例にして説明します。
class Product(models.Model):
class Meta:
#カテゴリ
verbose_name ="製品マスター"
verbose_name_plural ="製品マスター"
#カラム名の定義
product_name = models.CharField(max_length=255)
jancode = models.IntegerField("janコード")
上記例では、製品を一意に特定するためのカラムjancodeを数値型(IntegerField)で定義しています。
一般的なJanコードは13桁の数値です。
一方、DjangoのIntegerFiledの幅は-2147483648 ~ 2147483647(=MAX10桁)となっています。(下記リンク参照)
ここで疑問なのですが、DjangoのIntegerFiledフィールドの仕様は-2147483648 ~ 2147483647なのに上記モデル定義をマイグレーションしてadmin画面で13桁のjancodeを登録すると普通に登録できてしまいます。
ここで本記事のメインポイントになりますが、別環境DBに登録済みの13桁のjancodeを含むレコードをpython manage.py dumpdataコマンドでjson形式で出力したものを、別のDBにpython manage.py loaddataコマンドでインポートしようとしたところ以下のようなエラーが発生しました。
class Product(models.Model):
class Meta:
#カテゴリ
verbose_name ="製品マスター"
verbose_name_plural ="製品マスター"
#カラム名の定義
product_name = models.CharField(max_length=255)
jancode = models.BigIntegerField("janコード")
python manage.py loaddata sample.json --app app
Installed 92 object(s) from 1 fixture(s)
- python manage.py loaddataコマンドで
integerの範囲外エラー が発生した場合はmodels.pyのカラム定義を確認する。 - IntegerFieldを指定していて10桁を超えるデータを登録しようとしていた場合はBigIntegerFieldに変えてみる。
以上、「djangoモデルのIntegerField上限値に関するコラム」でした。

