2016-10-25 2 views
0

Ich habe mich umgesehen, und ich habe ein paar Lösungen gesehen, von denen ich dachte, dass sie für meinen eigenen Code funktionieren würden, aber nichts zu tun schienen.Python/Django - Erwartete eine Zeichenfolge oder ein bytesähnliches Objekt

Ich versuche, Daten aus einer JSON-Datei zu ziehen und die Informationen zu Arrays hinzuzufügen. Die Arrays werden dann verwendet, um Daten in mehrere Objekte einzugeben, die ich der Datenbank hinzufüge (ich weiß, das ist furchtbar ineffizient, aber so wie ich das ursprüngliche Skript geschrieben habe, musste ich keine Objekte zu einer Datenbank hinzufügen. Ich bin es planen, das zu ändern).

Objekt enthält eine Datumsangabe. Ich benutzte Pythons Strptime-Funktion, um die Strings in Datetime-Objekte zu konvertieren.

In meinem models.py habe ich ein DateTimeField für die Datetime.

Wenn ich versuche, und wandern aber ich folgende Fehlermeldung erhalten:

TypeError: expected string or bytes-like object 

Hier ist die gesamte Traceback:

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) 

Als Referenz hier ist mein views.py:

Hier ist meine 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') 

Hier ist meine urls.py:

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    # /table/ 
    url(r'^$', views.display, name='display'), 
] 

Andere Lösungen für ähnliche Probleme haben gesagt, dass das Problem mit meinem Standardwert liegt. Wenn ich jedoch keine Standardwerte festlege (wie im Code gezeigt), bekomme ich immer noch den gleichen Fehler.

+0

Erstens, da dies in einer Migration passiert, sollten Sie die Migration nicht * zeigen *? Und nicht mit Ihrem Problem verbunden, aber Sie müssen wirklich lernen, wie man Schleifen in Python macht; tipp: 'für x in range (len (was auch immer))' ist ein schreckliches Anti-Pattern. –

+0

@DanielRoseman Wenn Sie diese Migration "anzeigen", meinen Sie die tatsächliche Datei, die im Migrationsordner erstellt wurde? –

Antwort

1

Sie bekommen einen Fehler bei der Migration, also vermute ich, dass Ihr Datetime-Feld eine Zeichenfolge war und Sie haben es zu einem Datumsfeld gemacht. Das Problem scheint zu sein, wie Ihre Migration von diesen Textelementen in Daten geht. Möglicherweise müssen Sie Ihre Datenbank scrubben, indem Sie sie entweder dumpen (wenn es sich um Testdaten handelt) oder ein besseres Skript für die manuelle Migration erstellen.

Machen Sie Migrationen ist nicht perfekt - wenn Sie Daten in verschiedenen Formaten haben, müssen Sie den Code machen, um die Daten in neue Formate zu ändern und Informationen zu bewahren.

Wenn es nur Daten testen (wie es normalerweise ist), können Sie nur die Tabelle abschneiden - entweder manuell jetzt (löschen Sie die Datenbank sogar) oder mit einer Zeile im Migrationsskript.

Ihre schlechte Form, um Ihre Migrationsdateien zu löschen und sie erneut zu erstellen (besonders wenn Sie mehrere Benutzer haben), aber wenn Sie gute Prozesse zur Kontrolle haben, können Sie saubere Releases erstellen (dh eine Migration pro Freisetzung).

Verwandte Themen