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

think-old-man-imgDjango

本日は、

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

についてです

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

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

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

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

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

解決策はズバリ、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内のファイルに記述するという方法は今回のエラーに限らず色々と使えそうです!

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

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

という方は必見です!

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

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