Django сериализует все объекты в JSONB - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь сериализовать модель для отображения на существующем интерфейсе интерфейса. Модель настроена так:

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

Природа values заключается в том, что у него нет определенных ключей, поэтому он использует JSON, а не структурированную схему. В результате мне нужно перезапустить RestAPI, чтобы вывести список объектов с временным значением, который сплющен, так что каждый элемент содержит ключ time, а также все ключи для values.

Пока что я написал следующий сериализатор, который может возвращать данные в формате [{'time': 0.01, 'values': {'value1': 1, 'value2': 2, 'value3': 3}}]

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

Однако я не могу добиться вывода в необходимом формате: [{'time': 0.01, 'value1': 1, 'value2': 2, 'value3': 3}].

Я пробовал следующую настройку сериализатора:

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

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

но я не могу понять, что передать дочернему сериализатору, чтобы он возвращал все пары ключ-значение.

Поскольку эта модель используется для других видов, я предпочитаю использовать Serializer, а не ModelSerializer.

Надеюсь, ответ не слишком сложный.

Stu

1 Ответ

0 голосов
/ 08 ноября 2018

Может быть, для этого будет сложно использовать serializer, вместо этого вы можете отправить этот ответ вручную. Например:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...