Estoy tratando de serializar uno de mis modelos que tiene un ImageField. Parece que el serializador incorporado no puede serializar esto y, por lo tanto, pensé en escribir un serializador personalizado. ¿Podría decirme cómo podría serializar una imagen y usarla con el serializador JSON predeterminado en Django?

Gracias

1
Mridang Agarwalla 21 sep. 2011 a las 12:57

4 respuestas

La mejor respuesta

Escribí una extensión para el codificador simplejson. En lugar de serializar la imagen a base643, devuelve la ruta de la imagen. Aquí hay un fragmento:

def encode_datetime(obj):
    """
    Extended encoder function that helps to serialize dates and images
    """
    if isinstance(obj, datetime.date):
        try:
            return obj.strftime('%Y-%m-%d')
        except ValueError, e:
            return ''

    if isinstance(obj, ImageFieldFile):
        try:
            return obj.path
        except ValueError, e:
            return ''

    raise TypeError(repr(obj) + " is not JSON serializable")
5
Mridang Agarwalla 1 oct. 2011 a las 05:56

No puedes serializar el objeto, porque es una Imagen. Tienes que serializar la representación de cadena de su ruta.

La forma más fácil de lograrlo es llamar a su método str () cuando desea serializarlo.

json.dumps(unicode(my_imagefield)) # py2
json.dumps(str(my_imagefield)) # py3

Debe funcionar.

3
Rômulo Collopy 17 dic. 2014 a las 14:29

Use otro codificador tal que:

import json
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models.fields.files import ImageFieldFile


class ExtendedEncoder(DjangoJSONEncoder):
    def default(self, o):
        if isinstance(o, ImageFieldFile):
            return str(o)
        else:
            return super().default(o)


result = json.dumps(your_object, cls=ExtendedEncoder)
0
N.C. 29 nov. 2019 a las 12:36

Puede probar la codificación base64 para serializar la imagen que se utilizará dentro de un JSON

2
Nicu Surdu 21 sep. 2011 a las 09:18