【一発解決】django.db.utils.dataerrorはファイルの書き換えだけで処理できる

think-old-man-imgDjango

本日は、

Djangoエラー処理シリーズ「models.pyの書き換えによるDataError」

についてです

モデルフィールドをStr型からInt型に書き換えたところ

既存のデータが残ってしまう為、下記のようなエラーが出てしまいました

django.db.utils.DataError: "integer"型の入力構文が不正です: "suspect"

解決方法が見つかりましたので、共有します

答えはとてもシンプルでした!!

筆者プロフィール

筆者プロフィールアイコン

【現職】プロマネ/システムプランニング

【副業】ブログ(月間7万PV)/YouTube/Web・アプリ制作

【元】外資系金融機関の営業

コミュニケーション × ビジネススキル × 文章力 × プログラミングスキルを活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

ChatGPTでLINEボット

【今なら無料】ChatGPTでLINEボットを作りました!

友だち追加

解決策はズバリ、migrations内のpyファイル書き換え

appフォルダ内にあるmigrationsフォルダには、makemigrationsによって変更をデータベースに書き込むためのファイルが作成されます

migrations内にある最新のファイルで下記の通りコードを追加します

問題を解決してくれたコード

【これをmigrations内のファイル上部に足すだけ】

qs = Lead.objects.all()
for q in qs:
    q.stage = 0
    q.save()

migrations内の.pyファイルにも自由にコードが書けるんです!

【詳しく見てみよう!】元のmigrations内ファイル

$ python manage.py makemigrations

は問題なくできますが、

$ python manage.py migrate

で問題が起こりました

migrations内のファイルを見てみます

【元のファイルのコード】

# Generated by Django 3.1.6 on 2021-03-25 11:24

from django.db import migrations, models
from leads.models import Lead

class Migration(migrations.Migration):

    dependencies = [
        ('leads', '0020_lead_completed'),
    ]

    operations = [
        migrations.AlterField(
            model_name='lead',
            name='stage',
            field=models.IntegerField(choices=[(0, '見込み'), (1, 'OI'), (2, 'FF'), (3, '商談・商機'), (4, 'クロージング')], default=0, verbose_name='ステージ'),
        ),
    ]

【解決後】コード全体

# Generated by Django 3.1.6 on 2021-03-25 11:24

from django.db import migrations, models
from leads.models import Lead

qs = Lead.objects.all()
for q in qs:
    q.stage = 0
    q.save()

class Migration(migrations.Migration):

    dependencies = [
        ('leads', '0020_lead_completed'),
    ]

    operations = [
        migrations.AlterField(
            model_name='lead',
            name='stage',
            field=models.IntegerField(choices=[(0, '見込み'), (1, 'OI'), (2, 'FF'), (3, '商談・商機'), (4, 'クロージング')], default=0, verbose_name='ステージ'),
        ),
    ]

書き換え前のデータがstr型でしたので、makemigratins後に作成されるファイル「migrations内の最新ファイル」の上部に、既存のデータ全てをint型に書き換える処理を記述しました

qs = Lead.objects.all()
for q in qs:
    q.stage = 0
    q.save()

このおかげで、int型に変更後もエラーがなくなり、型の変更がスムーズにできるようになりました!

以上、とても簡単ですが結構はまりましたので共有させて頂きました。

migrations内のファイルに記述するという方法は今回のエラーに限らず色々と使えそうです!

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCへ投げ銭をする

タイトルとURLをコピーしました