0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Django】IntegerFieldのmax_lengthは11から変えられるのか?エラー「'max_length' is ignored when used with IntegerField」について

Last updated at Posted at 2023-05-11

概要

  • djangoではIntegerFieldはデフォルトで11で、これは変更できない?と聞いたので、実際に検証してみました。
  • 結論、整数値には「文字列の長さ」に関する制限はなく、あくまで「最大値」に関する制限があるということになります。

IntegerFieldとは?

  • IntegerField = データベースに保存される整数値を表すためのフィールド(Pythonのint型と対応)。
  • Djangoのmodels.pyで定義する際に使用されます。
  • 検証しようと思ったのは、以下の記事。IntegerFieldにはmax_lengthを設定しても効果がない、という記述がありました。

max_length=10でマイグレートするとどうなる?

  • 試しに、max_lengthオプションに以下の3パターンで実施することにしました。
    • max_length=11
    • max_length=10
    • max_length記載なし

max_length=11の場合

  • max_length=11を指定した状態でマイグレートしたら以下のメッセージが返ってきました。
System check identified some issues:

WARNINGS:
customer.Customer.id: (fields.W122) 'max_length' is ignored when used with IntegerField.
        HINT: Remove 'max_length' from field
  • ご丁寧に、max_lengthを消してくださいというヒントまで記載しています。。。
  • DBを見に行くと、もちろんですがint(11)となっています。

max_length=10の場合

  • やはり同じエラーメッセージが出ます。
  • DBを見に行くと、、int(11)となっています。これで、デフォルトで11であり、変更ができないことがわかりました。

max_length記載なしの場合

  • 勿論エラーメッセージは表示されません。
  • DBを見に行くと、int(11)となっています。確実ですね。

検証結果

  • 以上の検証から、デフォルトで11桁であり、そこから変更ができないことがわかります。
  • MySQLにおけるINT型の最大桁数は11桁。DjangoがMySQLをサポートするためにデフォルトで11桁にしたのでしょう。

整数値の場合はmin_valuemax_valueを使え

  • 冒頭でも記載したように、そもそもmax_lengthオプションは文字列フィールド(CharFieldTextFieldなど)で使用されるオプションです。
  • 整数値を保存するIntegerFieldの場合、min_valuemax_valueオプションがあり、これらを使うことで、フィールドに許可される値の範囲を制限します。
  • ちなみにMySQLでは、INTEGERフィールドに保存できる最大値は2147483647(32ビット符号付き整数型で表現できる最大値)となっています。あれ、10桁では?と思ったが、マイナスも入るので-2147483648を考慮しているっぽい。
    • 正確にいうと、、、-2147483648は10桁の整数。符号を入れると11桁の桁数が必要、という意味

デフォルトの最大桁数より大きいデータが入った場合は?

  • MySQLではデフォルトで値の範囲チェックを行なってくれず、自動で丸めるようになっているようです。確かにテストで適当に999...とか以前入れたデータを突っ込んだら、この数値がたくさん出てきた記憶があります。そういう意味だったのか。

デフォルトの最大桁数より大きくしたい場合は?

  • デフォルトでは21億までidを触れるわけですが、それを超える!という場合は、BigIntegerFieldを使用することで解決できます。
  • 最大で20桁の整数値を保存することができるとのこと。

小数点以下を含むフィールドであれば最大桁数を指定できる

  • DecimalFieldFloatFieldDecimalRangeFieldFloatRangeFieldのような小数点以下を含むフィールドであれば、max_digitsというオプションで数字部分の最大桁数を、decimal_placesで小数部分の桁数の指定できます。
  • 例えば、以下の場合は、整数部分は6桁が最大の有効値となります。最大値は999999.99です。
models.py
    menseki = models.DecimalField(
        db_column='menseki',
        default=0,
        null=True,
        max_digits=8,
        decimal_places=2)
  • 桁数オーバーの場合、decimal.InvalidOperationという例外が発生します。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?