Ich versuche ein benutzerdefiniertes JSON-Feld für Django-Projekte zu erstellen, die MySQL unterstützen. Das ist meine Modelle:InterfaceError für ein benutzerdefiniertes JSONField für Django
from __future__ import unicode_literals
from django.db import models
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
import json
name1 = 'name1'
name2 = 'name2'
class JSONField(models.TextField):
"""JSONField is a generic textfield that neatly serializes/unserializes
JSON objects seamlessly"""
# Used so to_python() is called
__metaclass__ = models.SubfieldBase
def to_python(self, value):
"""Convert our string value to JSON after we load it from the DB"""
if value == "":
return None
try:
if isinstance(value, basestring):
return json.loads(value)
except ValueError:
pass
return value
def get_db_prep_save(self, value, connection):
"""Convert our JSON object to a string before we save"""
if value == "":
return None
if isinstance(value, dict):
value = json.dumps(value, cls=DjangoJSONEncoder)
return super(JSONField, self).get_db_prep_save(value, connection)
# Articles/Content
class Content(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
data = JSONField(blank=True, null=True)
def __unicode__(self):
return self.title
def save(self, *args, **kwargs):
self.data = {
name1 : {
"image_url" : 'https://photosite.com/image1.jpg',
"views" : 0
},
name2 : {
"image_url" : 'https://photosite.com/image2.jpg',
"views" : 0
}
}
super(Content, self).save(*args, **kwargs)
Bitte beachten Sie die benutzerdefinierte Speichermethode für das Content-Modell. Wenn ich versuche, ein neues Content-Objekt zu speichern, bekomme ich diesen Fehler:
InterfaceError bei/admin/myapp/content/add/
Fehler Bindungsparameter 2 - wahrscheinlich nicht unterstützten Typen.
Was genau mache ich falsch? Was bedeutet der Fehler überhaupt? Ich meine es heißt "wahrscheinlich", als ob es nicht einmal sicher ist, ob es einen Fehler gibt. Irgendeine Hilfe?
Wenn Sie das vollständige Zurückverfolgungs möchten, können Sie es hier finden: http://pastebin.com/B15hZpbu
Sie wissen, dass bereits mehrere benutzerdefinierte JSON-Pakete verfügbar sind? Obwohl Sie von MySQL Unterstützung sprechen Ihr Stacktrace zeigt SQLite ?? – e4c5
Ich meinte, ich werde MySQL in der Produktion verwenden. Im Moment ist der Code in dev. Entschuldigung für die Verwirrung. –
Dieser Fehler wird nicht von django erzeugt. Es kommt von unten, wahrscheinlich der sqlite3-Treiber. Warum loggen Sie nicht alle Felder ein, bevor Sie die Super-Klassenmethode beim Speichern aufrufen und aktualisieren Sie die Frage damit. – e4c5