如何在Django Rest Framework中的get方法中序列化queryset?

Kat*_*ara 4 django django-rest-framework

我正在尝试在此页后的 APIView类中实现计算逻辑。
但是,出现以下错误是因为我尝试序列化查询集,而不是页面中演示的字典。
有谁知道我如何将queryset作为参数传递给序列化程序?如果没有,是否有任何方法可以转换为可以由序列化器序列化的格式?

{
    "non_field_errors": [
        "Invalid data. Expected a dictionary, but got QuerySet."
    ]
}  
Run Code Online (Sandbox Code Playgroud)

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"]
Run Code Online (Sandbox Code Playgroud)

序列化器

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')
Run Code Online (Sandbox Code Playgroud)

wia*_*erb 7

据我所知,您需要提供带有many=True. 至于文档:

要序列化查询集或对象列表而不是单个对象实例,您应该在实例化序列化程序时传递 many=True 标志。然后,您可以传递要序列化的查询集或对象列表。

http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-multiple-objects

所以引发错误的行应该是这样的

serializer = summarySerializer(queryset, many=True)
Run Code Online (Sandbox Code Playgroud)


JPG*_*JPG 7

您应该注意以下几点:
1.由于要传递QuerySet对象,因此不能提供data参数。

2. QuerySet是一个list相似的对象,因此您应该many=True在序列化时提供。

3 is_valid()仅当您将字典传递给data参数时,该方法才适用,此处不适用。

因此,将您的get_serialized()方法更改为

def get_serialized(self, pk, keyword):
    queryset = summary.objects.filter(html__pk=pk).filter(keyword=keyword)
    serializer = summarySerializer(queryset, many=True)
    data = serializer.data
    return data["json"]
Run Code Online (Sandbox Code Playgroud)


参考
1. 在Serializer中处理多个对象----many=True
2。is_valid()