L'objet django n'est pas une erreur sérialisable JSON après la mise à niveau de django vers la version 1.6.5
J'ai un django app qui a été en cours d'exécution sur 1.4.2
version et complètement de fonctionner très bien, mais j'ai récemment mis à jour pour django 1.6.5
et face à certains bizarre erreurs comme ci-dessous
En fait, je suis ce cours d'utilisateur/client dans le processus d'inscription sur mon site fonctionnalité
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
traceback
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
J'ai des doutes sur les raisons de la ci-dessus json d'erreur apparaît après la mise à jour et par la façon dont je suis l'aide personnalisée champ json dans certains de mes modèles comme ci-dessous
proj/utils.py
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)
Alors comment résoudre l'erreur ci-dessus ? peut quelqu'un me donner une explication de ce qui se passe à la cause de l'erreur ?
source d'informationauteur shiva krishna | 2014-06-15
Vous devez vous connecter pour publier un commentaire.
Django 1.6 changé le sérialiseur de pickle json. pickle peut sérialiser les choses que json ne le peuvent pas.
Vous pouvez modifier la valeur de SESSION_SERIALIZER dans votre
settings.py
pour revenir sur le comportement de Django avant la version 1.6.Vous voudrez peut-être lire sur session de sérialisation dans la documentation.
La définition de cette ligne de settings.py pour effacer l'erreur lors de la mise à niveau de django 1.6 version
Après l'analyse de la traçabilité en amont, il semble que le JSONEncoder ne peut pas sérialiser l'exemple de votre Client modèle. Généralement, vous avez obtenu cette erreur si vous essayez de sérialiser un modèle lié à d'autres modèles (Many2ManyField, etc.) à l'aide de json ou simplejson bibliothèques.
Voir ce https://docs.djangoproject.com/en/dev/topics/serialization/Vous pouvez également utiliser une partie de la 3e partie des logiciels tels que DjangoRestFramework en fonction de vos besoins.