Python | Django | エラー解消方法一覧
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でデータを入れるため,以下コードを実行する.
$ 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
以上