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

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

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

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

Python 3.x

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

Webサイト

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

Q&A

解決済

2回答

4860閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python 3.x

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

Webサイト

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

0グッド

0クリップ

投稿2018/06/25 11:41

編集2018/06/26 12:14

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

前提・実現したいこと

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

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

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

該当のソースコード

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

python

1from django.db import models 2from django.utils import timezone 3 4 5class DoDone(models.Model): 6 do_text = models.CharField(max_length=200) 7 done_text = models.CharField(max_length=200) 8 do_date = models.DateTimeField('do_date') 9 10# class Category(models.Model): 11 # category = models.CharField(max_length=30) 12 13 14class ToDoList(models.Model): 15 # category = models.ForeignKey(Category, default='NoData', on_delete=models.PROTECT) 16 todolist = models.CharField(max_length=200) 17 # wayoflearning = models.CharField(max_length=200) 18 created_at = models.DateTimeField(default=timezone.now) 19 # displayflag = models.BooleanField(default=True) 20 # priority = models.IntegerField() 21 22 # def __init__(self): 23 # self.priority = self.id 24 25 def __str__(self): 26 return self.todolist 27 28class DoneList(models.Model): 29 done_text = models.CharField(max_length=30)

Python

1# settings.pyの一部 2if "moritahiroki" in hostname: 3 # デバッグ環境 4 DEBUG = True 5 DATABASES = { 6 'default': { 7 'ENGINE': 'django.db.backends.sqlite3', 8 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 9 } 10 } 11 ALLOWED_HOSTS = [] 12else: 13 # 本番環境 14 DEBUG = False 15 LOGGING = { 16 'version': 1, 17 'disable_existing_loggers': False, 18 'handlers': { 19 'console': { 20 'class': 'logging.StreamHandler', 21 }, 22 }, 23 'loggers': { 24 'django': { 25 'handlers': ['console'], 26 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'), 27 }, 28 }, 29 } 30 # Database 31 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 32 # DB設定 33 import dj_database_url 34 35 PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 36 db_from_env = dj_database_url.config() 37 DATABASES = { 38 'default': dj_database_url.config() 39 } 40 ALLOWED_HOSTS = ['*']

試したこと

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

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

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

Django 2.0.6
python 3.6.4
Mac 10.13.5

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

どうやら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

python

1# models.py 2from django.db import models 3from django.utils import timezone 4 5 6class DoDone(models.Model): 7 do_text = models.CharField(max_length=200) 8 done_text = models.CharField(max_length=200) 9 do_date = models.DateTimeField('do_date') 10 11 12class Category(models.Model): 13 category = models.CharField(max_length=30) 14 15 16def default_category(): 17 category, _ = Category.objects.get_or_create(category='default') 18 # idを返す 19 return category.id 20 21 22class ToDoList(models.Model): 23 category = models.ForeignKey( 24 Category, default=default_category, on_delete=models.PROTECT) 25 todolist = models.CharField(max_length=200) 26 wayoflearning = models.CharField(max_length=200, default="") 27 created_at = models.DateTimeField(default=timezone.now) 28 displayflag = models.BooleanField(default=True) 29 priority = models.IntegerField(default=0) 30 31 # def __init__(self): 32 # self.priority = self.id 33 34 def __str__(self): 35 return self.todolist 36 37 38class DoneList(models.Model): 39 done_text = models.CharField(max_length=30) 40

python

1# test.py 2from django.test import TestCase 3from .models import ToDoList, Category 4 5 6class MyAppTest(TestCase): 7 def test_create_model(self): 8 # ToDoListを作ればCategoryも一緒に作られるはず・・・ 9 ToDoList.objects.create() 10 self.assertTrue(Category.objects.all().count() > 0) 11 category = Category.objects.all().first() 12 self.assertEqual(category.category, 'default')

bash

1$ ./manage.py test 2Creating test database for alias 'default'... 3System check identified no issues (0 silenced). 4. 5---------------------------------------------------------------------- 6Ran 1 test in 0.002s 7 8OK 9Destroying test database for alias 'default'...

投稿2018/06/26 16:20

tatamyiwathy

総合スコア1039

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

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

退会済みユーザー

退会済みユーザー

2018/06/27 02:28

深夜にありがとうございます。 このNoDataエラーが一度でた状態だともうSQLite3のDBを消してもどうにもうまく行かなそうだったため、Gitから修正まえデータを落としてきて、そちらで上書きしました。 その後、上記の内容でmodels.pyを書き直し、 ``python manage.py makemigrations``と``python manage.py migrate``を行ったところ、正常に走り始めました。 この度は正しい書き方を教えていただき、ありがとうございます。 最後に所感なのですが、 今後こういうDB関連のエラーが出た時、毎回修正を全て破棄してGitから前のバージョンを引っ張ってくるのかなあというのがあります。tatamyiwathyさんはこういうエラーが出た時、どのように原因の目星をつけてらっしゃるのでしょうか? ググったり、あとはSQL(?)のログ(?)を読んだり(?)でしょうか? よろしければ教えていただけると幸いです。
tatamyiwathy

2018/06/27 05:41

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

退会済みユーザー

2018/06/27 11:59

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

0

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

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

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

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

投稿2018/06/26 01:37

tatamyiwathy

総合スコア1039

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

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

退会済みユーザー

退会済みユーザー

2018/06/26 12:11

ご回答ありがとうございます!! ForeginKeyの正しい設定方法についてもわざわざ調べた上で教えていただきありがとうございます。 さて、お教えいただいた方法を試してみました。結果から言いますと、うまく行かず。。 db.sqlite3のファイルを削除して``python manage.py migrate``を実行しましたが、同じエラーがで続けております。また、dbsqlite3のファイルは再作成されました。 他に試したこととしては``python manage.py makemigrations``を実行してから``python manage.py migrate``を実行してみましたが、こちらも同じです。 一応ですが、settings.pyのうち、DBに関連する記述の部分をソースコードに追加します。 もしまだ時間を割いていただけるようでしたらみてみてください。 以上です。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問