2014-06-15 13 views
11

Upgrade ich eine django App haben, die auf 1.4.2 Version lief und völlig in Ordnung zu arbeiten, aber ich es vor kurzem aktualisiert 1.6.5 django und einige seltsame Fehler konfrontiert wie untendjango Objekt ist nicht JSON serializable Fehler nach django zu 1.6.5

Eigentlich bekomme ich dies während Benutzer/Client-Registrierung in meiner Website-Funktionalität

Request URL: http://example.com/client/registration/ 
Django Version:  1.6.5 
Exception Type:  TypeError 
Exception Value: <Client: test one> is not JSON serializable 
Exception Location:  /usr/lib/python2.7/json/encoder.py in default, line 184 
Python Executable: /home/user/.virtualenvs/test_proj/bin/python 
Python Version:  2.7.5 

Zurückverfolgungs

Traceback: 
File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    199.     response = middleware_method(request, response) 
File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/middleware.py" in process_response 
    38.      request.session.save() 
File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py" in save 
    57.    session_data=self.encode(self._get_session(no_load=must_create)), 
File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py" in encode 
    87.   serialized = self.serializer().dumps(session_dict) 
File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/core/signing.py" in dumps 
    88.   return json.dumps(obj, separators=(',', ':')).encode('latin-1') 
File "/usr/lib/python2.7/json/__init__.py" in dumps 
    250.   sort_keys=sort_keys, **kw).encode(obj) 
File "/usr/lib/python2.7/json/encoder.py" in encode 
    207.   chunks = self.iterencode(o, _one_shot=True) 
File "/usr/lib/python2.7/json/encoder.py" in iterencode 
    270.   return _iterencode(o, 0) 
File "/usr/lib/python2.7/json/encoder.py" in default 
    184.   raise TypeError(repr(o) + " is not JSON serializable") 

Exception Type: TypeError at /client/registration/ 
Exception Value: <Client: test one> is not JSON serializable 

Ich bin verwirrt, warum der oben json Fehler nach updation und übrigens worden erscheinen i in einigen meiner Modelle wie unten

proj/utils.py

ein individuelles json Feld bin mit
from django.db import models 
from django.utils import simplejson as json 
from django.core.serializers.json import DjangoJSONEncoder 


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=None): 
     '''Convert our JSON object to a string before we save''' 
     if not value or value == '': 
      return None 
     if isinstance(value, (dict, list)): 
      value = json.dumps(value, mimetype="application/json") 
     return super(JSONField, self).get_db_prep_save(value, connection=connection) 

from south.modelsinspector import add_introspection_rules 
add_introspection_rules([], ["^proj\.util\.jsonfield\.JSONField"]) 

settings.py

SERIALIZATION_MODULES = { 
    'custom_json': 'proj.util.json_serializer', 
     } 

json_serializer.py

from django.core.serializers.json import Serializer as JSONSerializer 
from django.utils.encoding import is_protected_type 

# JSONFields that are normally incorrectly serialized as strings 
json_fields = ['field_1', 'field_2'] 


class Serializer(JSONSerializer): 
    """ 
    A fix on JSONSerializer in order to prevent stringifying JSONField data. 
    """ 
    def handle_field(self, obj, field): 
     value = field._get_val_from_obj(obj) 
     # Protected types (i.e., primitives like None, numbers, dates, 
     # and Decimals) are passed through as is. All other values are 
     # converted to string first. 
     if is_protected_type(value) or field.name in json_fields: 
      self._current[field.name] = value 
     else: 
      self._current[field.name] = field.value_to_string(obj) 

So, wie der obigen Fehler zu lösen? Kann mir jemand erklären, was passiert, um den Fehler zu verursachen?

Antwort

40

Django 1.6 änderte den Serializer von Gurke zu Json. pickle kann Dinge serialisieren, die json nicht kann.

Sie können den Wert SESSION_SERIALIZER in Ihrem settings.py ändern, um das Verhalten von Django vor Version 1.6 zurückzubekommen.

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' 

Sie möchten vielleicht über session serialization in der Dokumentation lesen.

+5

ja Einstellungen diese Zeile in settings.py hat das Thema 'SESSION_SERIALIZER =‚django.contrib.sessions.serializers gelöscht django aktualisiert .PickleSerializer''. Danke –

+0

Welche Art von Dingen sind in JSON nicht serialisierbar als in Pickle? Danke – aRkadeFR

+0

@aRkadeFR: Für mich war es eine komplexe Datenstruktur mit vielen eigenen Klassen. – Matthias

0

Nach der Analyse der Rückverfolgung scheint es, dass der JSONEncoder die Instanz Ihres Client Modells nicht serialisieren kann. Im Allgemeinen haben Sie einen solchen Fehler, wenn Sie versuchen, ein Modell zu anderen Modellen (Many2ManyField, etc.) mit json oder simplejson Bibliotheken zu serialisieren.

Sehen Sie diese https://docs.djangoproject.com/en/dev/topics/serialization/, Sie können auch einige 3rd-Party-Pakete wie DjangoRestFramework je nach Bedarf verwenden.

5

diese Zeile einstellen, den Fehler settings.py wird gelöscht, wenn Version 1.6

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'