Как сериализовать набор запросов в методе get в Django Rest Framework? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь реализовать логику вычислений в классе APIView после этой страницы .
Однако я получил ошибку ниже, потому что я пытался сериализовать набор запросов, а не словарь, как показано на странице.
Кто-нибудь знает, как я могу передать набор запросов в сериализатор в качестве аргумента? Если нет, есть ли способ преобразовать в формат, который может быть сериализован сериализатором?

{
    "non_field_errors": [
        "Invalid data. Expected a dictionary, but got QuerySet."
    ]
}  

views.py

class envelopeData(APIView):

    def get(self,request,pk):
        #pk=self.kwargs['pk']
        #print (pk)

        glass_json=self.get_serialized(pk,"glass")
        print (glass_json)

    def get_serialized(self,pk,keyword):
        queryset = summary.objects.filter(html__pk=pk).filter(keyword=keyword)
        serializer = summarySerializer(data=queryset) <=get error here
        serializer.is_valid(raise_exception=True)

        data=serializer.validated_data
        return data["json"]

serializer.py

class strToJson(serializers.CharField):

    def to_representation(self,value):
        x=JSON.loads(value)
        return x

class summarySerializer(serializers.ModelSerializer):
    project=serializers.CharField(read_only=True,source="html.project")
    version = serializers.CharField(read_only=True, source="html.version")
    pk = serializers.IntegerField(read_only=True, source="html.pk")
    json = strToJson()
    #json=serializers.JSONField(binary=True)

    class Meta:
        model=summary
        fields=('pk','project','version','json')

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы должны знать об этих вещах,
1. Поскольку вы передаете объект QuerySet, вы не должны предоставлять аргумент data.

2. QuerySet представляет собой list подобный объект , поэтому при сериализации вы должны указать many=True.

3 метод is_valid() применим только в том случае, если вы передаете словарь аргументу data, которого здесь нет.

Итак, измените вам get_serialized() метод как,

<Code>def get_serialized(self, pk, keyword):
    queryset = summary.objects.filter(html__pk=pk).filter(keyword=keyword)
    <b>serializer = summarySerializer(queryset, many=True)
    data = serializer.data</b>
    return data["json"]</code>


Ссылки
1. Работа с несколькими объектами в сериализаторе ---- many=True
2. is_valid()

0 голосов
/ 28 августа 2018

Насколько я вижу, вам нужно предоставить класс сериализатора с many=True. Что касается документов:

Чтобы сериализовать набор запросов или список объектов вместо одного объекта Например, вы должны передать флаг many = True при создании экземпляра сериализатору. Затем вы можете передать набор запросов или список объектов для сериализованная.

http://www.django -rest-framework.org / апи-гид / сериализаторов / # дилинг-с-множественных объектов

Таким образом, строка, которая вызывает ошибку, должна выглядеть следующим образом

serializer = summarySerializer(queryset, many=True)
...