Python | Django | エラー解消方法一覧

2023年3月10日

Djangoで開発をする際,エラーが発生することは逃れられない.日々のエラーの内容を理解し,学習をするため,エラー解消一覧を以下に記す.

Unknown field(s) (url) specified for Movie

実施環境

Windows11
Python 3.11.1
Django 4.1.7

エラー解消の流れ

■エラーの内容の抜粋

Movieで特定されているfieldの中のurlが未確認

File "C:\Users\shiro\Desktop\dev_test\230303_Djanto_test\movieclip-project\movieclipApp\views.py", line 7, in <module>
    from .forms import MovieForm # 追加
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\shiro\Desktop\dev_test\230303_Djanto_test\movieclip-project\movieclipApp\forms.py", line 4, in <module>
    class MovieForm(forms.ModelForm):
  File "C:\Users\shiro\.virtualenvs\movieclip-project-6xXw4Rco\Lib\site-packages\django\forms\models.py", line 327, in __new__
    raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s) (url) specified for Movie 

■エラー原因

“models.py"のurlにカッコがなかったことがエラーの原因であった.

class Movie(models.Model):
    title = models.CharField(max_length=255)
    url = models.URLField
    youtube_id = models.CharField(max_length=255)
    clip = models.ForeignKey(Clip, on_delete=models.CASCADE)

■エラー解消方法

“models.py"のurlにカッコを加えた.

class Movie(models.Model):
    title = models.CharField(max_length=255)
    url = models.URLField()
    youtube_id = models.CharField(max_length=255)
    clip = models.ForeignKey(Clip, on_delete=models.CASCADE)

UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0x89 in position 6234: invalid start byte

実施環境

Windows11
Python 3.11.1
Django 4.1.7

エラー解消の流れ

■背景

Djangoでは,db.sqlite3がデフォルトのデータベースになるが,jsonを利用するため,細かいコードは省くが,以下コードを実行した."python manage.py dumpdata -o seed_data.json"でデータをjsonに入れ,"python manage.py loaddata seed_data.json"でjsonからデータを出力させた."python manage.py loaddata seed_data.json"を実行した際にエラーが出力された.

$ python manage.py dumpdata -o seed_data.json

$ python manage.py loaddata seed_data.json

■エラーの内容の抜粋

“utf-8″コーデックは0x89バイトをデコード(解読)できない

self.load_label(fixture_label)
  File "C:\Users\shiro\.virtualenvs\movieclip-project-6xXw4Rco\Lib\site-packages\django\core\management\commands\loaddata.py", line 251, in load_label
    for obj in objects:
  File "C:\Users\shiro\.virtualenvs\movieclip-project-6xXw4Rco\Lib\site-packages\django\core\serializers\json.py", line 67, in Deserializer       
    stream_or_string = stream_or_string.decode()
                       ^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 6234: invalid start byte

■エラー解消方法1

以下サイトによると,windowsではShift-JISのJSONファイルを作成される.そのため,データをjsonに入れる際に,UTF-8でデータを入れるため,以下コードを実行する.

eagle eight | Django

$ python -Xutf8 manage.py dumpdata -o seed_data.json

■エラー解消方法2

エラー解消方法2のやり方は以下になる.短期的にはエラーは解消されたが,後々デプロイする際に同じエラーが出てしまった.そのため,エラー解消方法1のやり方をおすすめする.

上記エラーコードの中の以下URLをコピーする.なお,"line 67″, “Deserializer", “stream_or_string = stream_or_string.decode()"が重要なので記憶しておく

"C:\Users\shiro\.virtualenvs\movieclip-project-6xXw4Rco\Lib\site-packages\django\core\serializers\json.py"

Windowsマークを右クリックし,"エクスプローラー"をクリックする.

以下フォルダが開く.

赤枠に,上記でコピーしたURLを貼り付ける.その後,URLの一番右にある"\json.py"のみ削除し,右矢印をクリックする.

以下フォルダに遷移する.

“json.py"を右クリックし,エディターで開く.私の場合,"Edit with Notepad++"をクリックすると,エディターが開く.

“json.py"が以下のように開くので,スクロールダウンする."line 67″付近にある"Deserializer" を探す.

以下のように,"Deserializer"が見つかり,67行目に"stream_or_string = stream_or_string.decode()"が記載されているのがわかる.そのため,()内に"Shift-JIS"を入力し,保存する.

VS CodeのTerminalに戻り,"python manage.py loaddata seed_data.json"を実行すると,エラーなくjsonに含まれているデータを出力させることができた.

$ python manage.py loaddata seed_data.json
Installed 45 object(s) from 1 fixture(s)

参考

YouTube | UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte

以上