質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

932閲覧

AutoFieldで文字数制限をしたい。

nika_nika

総合スコア38

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/04/08 10:56

編集2022/04/10 11:44

前提

python:3.9
Django: 3.2.10
MySQL

質問内容

今回、独自のカラム(staff_id)を作成したいと考え、BigAutoField(primary_key=True)を使用した。
auto_incrementにしたい、BigAutoFieldにしたが文字数制限の設定ができない。
・実現したいこと:00000000~99999999の8桁の数字の範囲で登録できるようにしたい。
下記のようなモデルを作成したが、WARNINGSとDjangoに怒られ、当然DBを確認してもmax_lengthは無視されていた。

models.py

1class Staff(models.Model): 2 staff_id = models.BigAutoField(primary_key=True,max_length=8)

error

1WARNINGS: 2admin.Staff.Staff_id: (fields.W122) 'max_length' is ignored when used with BigAutoField. 3 HINT: Remove 'max_length' from field

migrations

1migrations.CreateModel( 2 name='Staff', 3 fields=[ 4 ('staff_id', models.BigAutoField(max_length=8, primary_key=True, serialize=False)), 5 ], 6 ), 7

MySQL

1mysql> desc admin_staff; 2+--------------------------+--------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+--------------------------+--------------+------+-----+---------+----------------+ 5| staff_id | bigint | NO | PRI | NULL | auto_increment | 6

試したこと

class Staff(models.Model): staff_id = models.BigAutoField(primary_key=True,validators=[MaxValueValidator(8)])

MaxValueValidatorを使用して、バリデータをつけようかと思っているのですが、効果はないでしょうか?
色々検索してみたのですが、AutoFieldに文字数制限をかけられるような記事がなかったためご質問させていただきました。よろしくお願い致します。

上記にMaxValueValidatorを使用する方法を検討していたが、0~8の数字の範囲しか制限できない。
実現したいことは、99999999までの制限なのでお門違いなことをしていました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamap55

2022/04/08 14:44

1. 最初の一文の「プライマリキーを独自設定したいため、BigAutoField(primary_key=True)を使用した。」がよくわかりません。プライマリキーを独自設定とはPKを独自のカラム(ここでいう所のStaff_id)で指定したいという事であっていますでしょうか? 2. BigAutoFieldで行いたい制限は日本語でいうとどういう事でしょうか?(BigAutoFieldは連番で値が振られるので、仮にmax_length=8が有効だった場合、99999999までに制限したい?MaxValueValidator(8)という事は0から8までの値としたい?)
nika_nika

2022/04/09 13:39

ご質問の追記ありがとうございます。 1. そちらの認識で問題ないです。 書き方分かりづらくしてすいません。修正いたしまく。 2. 日本語ですと、99999999の8桁で制限したいです。 MaxValueValidatorを勘違いしておりました。こちらも修正いたします。 今日対応が難しく明日修正いたします。遅れてすみません。宜しくお願い致します。
guest

回答1

0

ベストアンサー

python

1from django.core.validators import MaxValueValidator, MinValueValidator 2staff_id = models.BigAutoField(primary_key=True,validators=[MinValueValidator(0), MaxValueValidator(99999999)])

↑とすればできる気がしますが、BigAutoFieldで有効になるかはちょっとわからないので試してみてください。
※ちなみにその場合Bigである必要はないのでAutoFieldで良い気がします
※あまり自信がないのでわかる方指摘頂けると助かります。


以下、余計なお世話かもですが蛇足です。
多分やりたい事は違うと考えていて、既に99999999のレコードが存在する場合、エラーとしてよいのでしょうか?
その後の運用を考えるとあまり適切じゃない気がします。
99999999までに抑えることで実現したい事を聞いた方がもう少し良い方法がある気がしました。

投稿2022/04/11 13:01

yamap55

総合スコア1376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nika_nika

2022/04/12 05:31

前回に続き、ご回答誠にありがとうございます。 BigAutoFieldにしているのは、仕様でBigintと書いてあったので、何も考えずそれ通りにやろうとしただけでした。こんな考え方だと、後々使えないエンジニアになりますよね、、反省します。 > 99999999までに抑えることで実現したい事を聞いた方がもう少し良い方法がある気がしました。 こちらも不思議に思わず開発を進めてました。 ご教示ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問