Terminé resolviendo este problema anulando el serializador JSON incluido de Django, específicamente el método handle_field, en un archivo de serializador personalizado llamado custom_json_serializer.py. Al hacer esto, puedo asegurar que los JSONFields específicos permanezcan como están, sin convertirlos a cadenas.
En caso de que alguien más se encuentre con este problema, estos son los pasos que tomé. He tenido que añadir este serializador personalizado al archivo settings.py:
SERIALIZATION_MODULES = {
'custom_json': 'myapp.utils.custom_json_serializer',
}
y luego llamar al serializar los datos de Django:
python manage.py dumpdata mymodel --format=custom_json --indent=2 --traceback > mymodel_data.json
El serializador personalizado parece:
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 = ['problem_field1', 'problem_field2']
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)
La parte realmente extraña es que antes de esta corrección algunos JSONFields se serializaban muy bien, mientras que otros no. Es por eso que tomé el enfoque de especificar los campos que se manejarán. Ahora todos los datos se serializan correctamente.