2016-10-25 8 views
0

私は自分のコードではうまくいくと思ったソリューションをいくつか見てきましたが、何もしていないようです。Python/Django - 文字列またはバイトのようなオブジェクトを期待しています

私はJSONファイルからデータを取り出し、配列に情報を追加しようとしています。配列は、データベースに追加するいくつかのオブジェクトにデータを入力するために使用されます(これはひどく非効率ですが、元のスクリプトを書き込んだ方法でデータベースにオブジェクトを追加する必要はありませんでした。それを変更する計画)。

オブジェクトには、関連する日付時刻が含まれています。 Pythonのstrptime関数を使用して文字列をdatetimeオブジェクトに変換しました。

私のmodels.pyには、datetimeのDateTimeFieldがあります。

私がしようとすると移行する場合は、しかし、私は次のエラーを取得する:ここで

TypeError: expected string or bytes-like object 

が全体のトレースバックです:参考

Applying interactive_table.0016_auto_20161024_2259...Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/migrations/executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/migrations/migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 84, in database_forwards 
    field, 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 231, in add_field 
    self._remake_table(model, create_fields=[field]) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 113, in _remake_table 
    self.effective_default(field) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 221, in effective_default 
    default = field.get_db_prep_save(default, self.connection) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 755, in get_db_prep_save 
    prepared=False) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1438, in get_db_prep_value 
    value = self.get_prep_value(value) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1417, in get_prep_value 
    value = super(DateTimeField, self).get_prep_value(value) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1275, in get_prep_value 
    return self.to_python(value) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1378, in to_python 
    parsed = parse_datetime(value) 
    File "/Users/andrewho/anaconda/lib/python3.5/site-packages/django/utils/dateparse.py", line 93, in parse_datetime 
    match = datetime_re.match(value) 

、ここに私のviews.pyです:

def getInfo(counter, hekJSON): 
    for counter in range(len(hekJSON["Events"])): 
     dateAndTimeHEK.append(convertTimes(hekJSON["Events"][counter]["startTime"])) 
     xcen.append(float("%.2f" % hekJSON["Events"][counter]["xCen"])) 
     ycen.append(float("%.2f" % hekJSON["Events"][counter]["yCen"])) 
     xfov.append(float("%.2f" % hekJSON["Events"][counter]["raster_fovx"])) 
     yfov.append(float("%.2f" % hekJSON["Events"][counter]["raster_fovy"])) 
     sciObj.append(hekJSON["Events"][counter]["sciObjectives"]) 


def convertTimes(dateAndTime): 
    dateTime = datetime.datetime.strptime(dateAndTime, '%Y-%m-%d %H:%M:%S') 
    return dateTime 

def display(request): 
    noaaNmbr='11809' 
    #for right now, this is the only active region that I'm pulling data for. When I get the graph up and running, I will make it more interactive for the user so that he can 

    urlData = "http://www.lmsal.com/hek/hcr?cmd=search-events3&outputformat=json&instrument=IRIS&noaanum="+ noaaNmbr +"&hasData=true" 

    webUrl = urlopen(urlData) 
    counter = 0 
    data = webUrl.read().decode('utf-8') 
    hekJSON = json.loads(data) 
    getInfo(counter, hekJSON) 

    for i in range(getNumberOfEntries(hekJSON)): 
     observation = models.HEK_Observations(noaaNmbr=noaaNmbr, dateAndTime=dateAndTimeHEK[i], xcen=xcen[i], ycen=ycen[i], xfov=xfov[i], yfov=yfov[i], sciObj=sciObj[i]) 
     observation.save() 

    return render(request, 'template.html', {'obj': models.HEK_Observations.objects.filter(noaaNmbr=noaaNmbr)}) 

ここは私のmodels.pyです:

from django.db import models 
import datetime 

class HEK_Observations(models.Model): 
    dateAndTime = models.DateTimeField(max_length = 40, default = None, verbose_name = 'Date And Time') 

ここでは私のurls.pyです:類似した問題へ

​​

他の解決策は、問題は私のデフォルト値であると述べています。しかし、(コードに示されているような)デフォルトを設定しないと、私は同じエラーを受けます。

+0

第1に、これは移行中に発生しているため、移行する必要はありませんか?あなたの問題には関係しませんが、実際にはPythonでループを実行する方法を学ぶ必要があります。ヒント: 'for x in range(len(何でも))'は恐ろしい反パターンです。 –

+0

@DanielRosemanマイグレーションを「表示する」とは、マイグレーションフォルダに作成された実際のファイルを表示することですか? –

答えて

1

移行でhteエラーが発生しているので、datetimeフィールドが文字列だったと推測しています。これを日付フィールドにしました。問題は、あなたの移行がそれらのテキスト要素から日付にどのように移行しているかのようです。潜在的にあなたはそれをダンプする(テストデータの場合)か、より良い手動の移行スクリプトを作成することで、あなたのdbをスクラブする必要があります。

マイグレーションを行うのは完全ではありません - 既存のデータが異なるフォーマットである場合は、データを新しいフォーマットに変更して情報を保存するコードを作成する必要があります。

通常のテストデータであれば、手動で今すぐ(データベースを削除する)、または移行スクリプトの行でテーブルを切り捨てることができます。

マイグレーションファイルを「削除」して再度作成するのは悪いフォームです(特に複数のユーザーがいる場合)。ただし、制御しやすいプロセスがあれば、クリーンリリースを行うことができますリリース)。

関連する問題