Django serializing all objects in JSONB

Viewed 145

I am trying to serialize a model for displaying on an existing front end interface. The model is setup as such:

class Timevalue(models.Model):
    time = models.FloatField(blank=True, null=True)
    values = JSONField(blank=True, null=True)

The nature of the values is that it has no defined keys, therefore it is using JSON rather than a structured schema. As an end result, I need to RestAPI to output a list of timevalue objects that is flattened so that each element contains the time key as well as all the keys for the values.

So far I have written the following serializer that can return the data in the format of [{'time': 0.01, 'values': {'value1': 1, 'value2': 2, 'value3': 3}}]

class TimevalueSerializer(serializers.Serializer):
    time = serializers.FloatField()
    values = serializers.JSONField()

However I cannot achieve getting the output in the necessary format: [{'time': 0.01, 'value1': 1, 'value2': 2, 'value3': 3}].

I have tried the following serializer setup:

class TimevaluechildSerializer(serializers.Serializer):
    fields = '*'

class TimevalueSerializer(serializers.Serializer):
    time = serializers.FloatField()
    values = TimevaluechildSerializer('*')

but I cannot work out what to pass to the child serializer in order for it to return all of the key-value pairs.

As this model is used for other views, I prefer to use a Serializer rather than a ModelSerializer.

Hopefully the answer isn't too difficult.

Stu

1 Answers

Maybe using serializer will be hard for this, rather than that, you can send this response manually. For example:

from rest_framework import status
from rest_framework.response import Response

class SomeApiView(ApiView):
    resp_list = list()
    for i in Timevalues.objects.all():
        t = {'time': i.time}
        t.update(i.values)
        resp_list.append(t)

    return Response(resp_list, status=status.HTTP_200_OK)
Related