【问题标题】:How to serialize queryset in get method in Django Rest Framework?如何在 Django Rest Framework 的 get 方法中序列化查询集?
【发布时间】:2018-08-28 14:45:59
【问题描述】:

我正在尝试在this page 之后的 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')

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你应该注意这些事情,

    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"]

    参考文献

    1. Dealing with multiple objects in Serializer ---- many=True
    2. is_valid()

    【讨论】:

      【解决方案2】:

      据我所知,您需要为序列化程序类提供many=True。 至于文档:

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

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

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

      serializer = summarySerializer(queryset, many=True)
      

      【讨论】:

      • 感谢您的回答。实现 many=True,我在 {"non_field_errors": ["Expected a list of items but got type \"QuerySet\" 下面得到错误。" ] }
      • @KatsuyaObara 你能试试serializer = summarySerializer(queryset, many=True)吗?注意没有data 参数名称。
      • 我试过 serializer = summarySerializer(data=queryset, many=True) 但结果是一样的。 { "non_field_errors": [ "期望一个项目列表,但得到类型 \"QuerySet\"。" ] }
      猜你喜欢
      • 2017-07-09
      • 2014-04-16
      • 2021-09-25
      • 2020-11-27
      • 1970-01-01
      • 2023-03-30
      • 2014-12-19
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多