django-rest-framework: ¿Cómo serializo un campo que ya contiene JSON?

Soy bastante nuevo en django-rest-framework, por lo que podría necesitar ayuda.

Tengo un objeto con un TextField que es una cadena que contiene JSON.

Estoy usando django-rest-framework para serializar todo el objeto como JSON. Sin embargo, esta única cadena que ya es JSON se serializa como una cadena codificada que contiene JSON en lugar de JSON.

¿Cómo puedo decirle al serializador que envíe este campo como está en lugar de tratar de transformar esta cadena a JSON? ¿Hay algún tipo de decorador de “ignorar” o anulación que pueda usar? ¿O puedo pre-analizar este JSON antes de serializar?

Esta es la diferencia entre tener:

{"data": data} 

y

 {"data": "data"} 

Este último es más molesto de usar en el lado del cliente …

Simplemente puedes decodificar el json en el objeto python:

 json_obj = json.loads(model.json_text) 

Una vez que serialice su objeto, reemplace este campo con el objeto decodificado:

 data = serializer.data data["field"] = json_obj return Response(data) 

Resolví esto de otra manera:

1: use un campo JSON para el contenido JSON ( django-jsonfield o django-json-field debería estar bien). Éstos entonces serán para cargas / volcados según sea necesario.

2: en mi serializador, use el método de transformación para evitar que los datos agregados como cadena a la respuesta

 class MyModelSerializer(serializers.ModelSerializer): def transform_myjsonfield(self, obj, value): return obj.myjsonfield class Meta: model = MyModel 

Si necesita acceso de escritura, solo tiene que agregar un método validate_myjsonfield que se convierta de nuevo.

(Por supuesto, esto también podría hacerse con un campo de serializador DRF personalizado.

djangorestframework==3.9.1 es lo que funciona para mí, djangorestframework==3.9.1 :

 import json from rest_framework import serializers from .models import WeatherLocation class WeatherLocationSerializer(serializers.ModelSerializer): LocationId = serializers.CharField(source='location_id') City = serializers.CharField(source='city') Region = serializers.CharField(source='region') Name = serializers.CharField(source='name') Country = serializers.CharField(source='country') WeatherForecastLongTermTimePeriods = serializers.JSONField(required=False, allow_null=True, source='weather_forecast_long_term_time_periods') WeatherForecastShortTermTimePeriods = serializers.JSONField(required=False, allow_null=True, source='weather_forecast_short_term_time_periods') def to_representation(self, instance): ret = super(WeatherLocationSerializer, self).to_representation(instance) ret['WeatherForecastLongTermTimePeriods'] = json.loads(ret['WeatherForecastLongTermTimePeriods']) ret['WeatherForecastShortTermTimePeriods'] = json.loads(ret['WeatherForecastShortTermTimePeriods']) return ret class Meta: model = WeatherLocation fields = ['LocationId', 'City', 'Region', 'Name', 'Country', 'WeatherForecastLongTermTimePeriods', 'WeatherForecastShortTermTimePeriods', ] 

Pensé que habría una forma más fácil de hacer esto, pero al cambiar el comportamiento de to_representation , puedo convertir mis campos de texto a JSON. Para referencia, aquí está mi models.py :

 from django.db import models class WeatherLocation(models.Model): """ Weather app schema, from southparc """ location_id = models.CharField(primary_key=True, null=False, blank=False, default=None, max_length=254, editable=True) region = models.CharField(max_length=2, null=False, blank=False) city = models.CharField(null=False, blank=False, max_length=254) province = models.CharField(null=True, blank=True, max_length=254) name = models.CharField(null=True, blank=True, max_length=254) country = models.CharField(null=True, blank=True, max_length=254) # JSON fields weather_forecast_long_term_time_periods = models.TextField(default="", blank=True) weather_forecast_short_term_time_periods = models.TextField(default="", blank=True) # Dates created_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now=True) 

Espero que ayude. Si utiliza un campo JSONField que es compatible con Postgres, estoy seguro de que no tendrá que hacer esto. Estoy usando un TextField para guardar mi JSON aquí. Pensé que especificar el tipo de campo como serializers.JSONField en el serializador sería suficiente pero no es el caso.