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

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

ただいまの
回答率

87.49%

OperationalError at /admin/polls/question/

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,908
退会済みユーザー

退会済みユーザー

OperationalError at /admin/polls/question/
no such column: polls_question.question_text
とエラーが出ました。
Tracebackでは

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/XXX/django/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/XXX/django/django/core/handlers/base.py", line 130, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/XXX/django/django/core/handlers/base.py", line 128, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/XXX/django/django/contrib/admin/options.py", line 555, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/Users/XXX/django/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Users/XXX/django/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/Users/XXX/django/django/contrib/admin/sites.py", line 224, in inner
    return view(request, *args, **kwargs)
  File "/Users/XXX/django/django/utils/decorators.py", line 62, in _wrapper
    return bound_func(*args, **kwargs)
  File "/Users/XXX/django/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Users/XXX/django/django/utils/decorators.py", line 58, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/Users/XXX/django/django/contrib/admin/options.py", line 1658, in changelist_view
    selection_note=_('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
  File "/Users/XXX/django/django/db/models/query.py", line 223, in __len__
    self._fetch_all()
  File "/Users/XXX/django/django/db/models/query.py", line 1098, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/Users/XXX/django/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/Users/XXX/django/django/db/models/sql/compiler.py", line 1001, in execute_sql
    cursor.execute(sql, params)
  File "/Users/XXX/django/django/db/backends/utils.py", line 77, in execute
    return super().execute(sql, params)
  File "/Users/XXX/django/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql, params)
  File "/Users/XXX/django/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Users/XXX/django/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql, params)
  File "/Users/XXX/django/django/db/backends/sqlite3/base.py", line 303, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: polls_question.question_text

pollsアプリの中で

from django.db import models

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question,on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)


とコードを書きました。
そして、

./manage.py makemigrations


とコマンドをうち
(You are trying to add a non-nullable field 'pub_date' to question without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 2 と出たときに2を選択)

さらに

./manage.py migrate


とコマンドをうちました。
そのときに、

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply the


と出ました。
それから

./manage.py runserver


としてサーバーを立ち上げました。

./manage.py makemigrations


./manage.py migrate


のmigrateでなぜ2種類のコマンドがあるのかが理解できていませんが、
なぜ/admin/polls/question/ のurlができていないのかわかりません。
どう直せば良いのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

(You are trying to add a non-nullable field 'pub_date' to question without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 2 と出たときに2を選択)

この表示されている内容ですが、
「'pub_date'っていう空欄が許されないフィールドをデフォルトの値なしで追加しようとしてるけど、既に追加しているデータに何らかの値を入れないとまずいよ。どうする?

1) デフォルトの値を入れる
2) 一旦終了して、models.pyを修正するよ

といった感じの内容です。
モデルを作成しDBに反映した後に、フィールドを修正・追加するときによく見かける内容です。
(一度makemigrationsとmigrateしてから、pub_dateを新しく追加したりしませんでしたか?)

既にDBに登録されているデータにはpub_dateというフィールドはまだないので、それをなんとかしないといけません。
大まかな解決策は2つあり、以下のようにpub_dateが空欄でも良いように変更するか

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', null=True, blank=True)

もしくはデフォルトの値を入れる必要があります。
このとき、データの型には気をつけてください。timezone.nowは、そのタイムゾーンでの今現在の日付時間になります。

from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', default=timezone.now)

どちらかにしたあと、makemigrations と migrateを行ってみてください。

考えるのが面倒であれば、とりあえず空欄でも良いような設定にしておくと良いです。
その後、空欄許可はまずいなーと思ったら全てのデータのpub_dateを入力し、null=True, blank=Trueを消してmakemigrations migrateをすると良いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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