2016-07-30 17 views
1

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

+0

Sie wissen, dass bereits mehrere benutzerdefinierte JSON-Pakete verfügbar sind? Obwohl Sie von MySQL Unterstützung sprechen Ihr Stacktrace zeigt SQLite ?? – e4c5

+0

Ich meinte, ich werde MySQL in der Produktion verwenden. Im Moment ist der Code in dev. Entschuldigung für die Verwirrung. –

+0

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

Antwort

1

Dieser Code wird eine undefinierte Variable Fehler erzeugen, bevor Sie Ihren Benutzer Methode aufrufen.

data = { 
     name1 : { 
      "image_url" : 'https://photosite.com/image1.jpg', 
      "views" : 0 
     }, 
     name2 : { 
      "image_url" : 'https://photosite.com/image2.jpg', 
      "views" : 0 
     } 
    } 

name1 und name2 sind eindeutig nicht im Code definiert.