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

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

ただいまの
回答率

90.52%

  • Python 3.x

    6388questions

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

  • Webサイト

    1077questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • Django

    1051questions

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

【Django】外部キーを含むモデルを追加した際に出るエラーValueError: invalid literal for int() with base 10: 'NoData'について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 248

いつもお世話になっています。エラー出てちょっと困っています。

 前提・実現したいこと

Django初心者です。
Djangoでの開発に慣れるため、TODOリスト的なサイトを作っています。
今までは単に「やりたいこと」を列挙するだけの機能だったのですが、
今回「やりたいこと」を「カテゴリ」に分類したいなと考え、外部キーを含むモデルを追加しました。
python manage.py makemigrationsを実行したのち、
python manage.py migrateを実行したところ、下記のようなエラーが発生しました。
なお、今回追加したコードを全てコメントアウトしても同様のエラーが出続けます。

 発生している問題・エラーメッセージ

ValueError: invalid literal for int() with base 10: 'NoData'

 該当のソースコード

今回の追加箇所はコメントアウトされた箇所です。

from django.db import models
from django.utils import timezone


class DoDone(models.Model):
    do_text = models.CharField(max_length=200)
    done_text = models.CharField(max_length=200)
    do_date = models.DateTimeField('do_date')

# class Category(models.Model):
    # category = models.CharField(max_length=30)


class ToDoList(models.Model):
    # category = models.ForeignKey(Category, default='NoData', on_delete=models.PROTECT)
    todolist = models.CharField(max_length=200)
    # wayoflearning = models.CharField(max_length=200)
    created_at = models.DateTimeField(default=timezone.now)
    # displayflag = models.BooleanField(default=True)
    # priority = models.IntegerField()

    # def __init__(self):
       # self.priority = self.id

    def __str__(self):
        return self.todolist

class DoneList(models.Model):
    done_text = models.CharField(max_length=30)
# settings.pyの一部
if "moritahiroki" in hostname:
    # デバッグ環境
    DEBUG = True
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    ALLOWED_HOSTS = [] 
else:
    # 本番環境
    DEBUG = False
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['console'],
                'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
            },
        },
    }
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    # DB設定
    import dj_database_url

    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
    db_from_env = dj_database_url.config()
    DATABASES = {
        'default': dj_database_url.config()
    }
    ALLOWED_HOSTS = ['*']

 試したこと

・追加箇所のコメントアウト
同様のエラーが出る
・端末の再起動
同様のエラーが出る

とりあえず書いてみてエラー潰しながらmodels.pyの書き方を勉強すればいいか〜〜と思っていたのですが、ちょっとそれも無理そうです。ツッコミどころの多いコードかと思いますが、チェックいただければ幸いです。

 補足情報(FW/ツールのバージョンなど)

Django 2.0.6
python 3.6.4
Mac 10.13.5

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

回答の続きですがコードを張りつけたいので新しい回答とします。

どうやらForeignKeyのdefaultはモデルオブジェクトのidを受けるようです。
How do you specify a default for a Django ForeignKey Model or AdminModel field?

実際に試してみましたがToDoListモデルを生成するとCategoryモデルも生成されます。

Python 3.5.2
Django 2.0

# models.py
from django.db import models
from django.utils import timezone


class DoDone(models.Model):
    do_text = models.CharField(max_length=200)
    done_text = models.CharField(max_length=200)
    do_date = models.DateTimeField('do_date')


class Category(models.Model):
    category = models.CharField(max_length=30)


def default_category():
    category, _ = Category.objects.get_or_create(category='default')
    # idを返す
    return category.id


class ToDoList(models.Model):
    category = models.ForeignKey(
        Category, default=default_category, on_delete=models.PROTECT)
    todolist = models.CharField(max_length=200)
    wayoflearning = models.CharField(max_length=200, default="")
    created_at = models.DateTimeField(default=timezone.now)
    displayflag = models.BooleanField(default=True)
    priority = models.IntegerField(default=0)

    # def __init__(self):
    # self.priority = self.id

    def __str__(self):
        return self.todolist


class DoneList(models.Model):
    done_text = models.CharField(max_length=30)
# test.py
from django.test import TestCase
from .models import ToDoList, Category


class MyAppTest(TestCase):
    def test_create_model(self):
        # ToDoListを作ればCategoryも一緒に作られるはず・・・
        ToDoList.objects.create()
        self.assertTrue(Category.objects.all().count() > 0)
        category = Category.objects.all().first()
        self.assertEqual(category.category, 'default')
$ ./manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Destroying test database for alias 'default'...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 11:28

    深夜にありがとうございます。
    このNoDataエラーが一度でた状態だともうSQLite3のDBを消してもどうにもうまく行かなそうだったため、Gitから修正まえデータを落としてきて、そちらで上書きしました。

    その後、上記の内容でmodels.pyを書き直し、
    ``python manage.py makemigrations``と``python manage.py migrate``を行ったところ、正常に走り始めました。
    この度は正しい書き方を教えていただき、ありがとうございます。


    最後に所感なのですが、
    今後こういうDB関連のエラーが出た時、毎回修正を全て破棄してGitから前のバージョンを引っ張ってくるのかなあというのがあります。tatamyiwathyさんはこういうエラーが出た時、どのように原因の目星をつけてらっしゃるのでしょうか? ググったり、あとはSQL(?)のログ(?)を読んだり(?)でしょうか?

    よろしければ教えていただけると幸いです。

    キャンセル

  • 2018/06/27 14:41

    モデルをいじくりまわしているうちにmigrationファイルがコンフリクトを起こしたような状態になることはよくあります。migrationファイルを直接修正しても良いのですが、原因を突き止めるのに時間がかかってしまいますので、そういうときは一旦エラーにならないリビジョンまで戻ってモデルを再修正していきますね。

    キャンセル

  • 2018/06/27 20:59

    なるほど、ガチで原因を突き止めようとするときはmigrationファイル、面倒ならエラーにならない修正前のものを持ってくる(今回の対応)って感じなのですね。ありがとうございました!!

    キャンセル

0

データベースはsqlite3ですか?その場合はdb.sqlite3ファイルを削除してからpython manage.py migrateを実行してください。

それから自分は使用したことがないのですが、ForeginKeyのdefaultに渡すのは定数ではなくモデルを生成する関数のようですよ。

Djangoで、ForeignKey、ManyToManyFieldに初期値を与える

NULLでもいいような気もしますけどね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/26 21:11

    ご回答ありがとうございます!!
    ForeginKeyの正しい設定方法についてもわざわざ調べた上で教えていただきありがとうございます。

    さて、お教えいただいた方法を試してみました。結果から言いますと、うまく行かず。。
    db.sqlite3のファイルを削除して``python manage.py migrate``を実行しましたが、同じエラーがで続けております。また、dbsqlite3のファイルは再作成されました。

    他に試したこととしては``python manage.py makemigrations``を実行してから``python manage.py migrate``を実行してみましたが、こちらも同じです。

    一応ですが、settings.pyのうち、DBに関連する記述の部分をソースコードに追加します。
    もしまだ時間を割いていただけるようでしたらみてみてください。

    以上です。ご回答ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6388questions

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

  • Webサイト

    1077questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • Django

    1051questions

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

  • トップ
  • Djangoに関する質問
  • 【Django】外部キーを含むモデルを追加した際に出るエラーValueError: invalid literal for int() with base 10: 'NoData'について