【问题标题】:Query set is not JSON serializable查询集不是 JSON 可序列化的
【发布时间】:2021-04-28 06:35:08
【问题描述】:

我正在尝试创建一个端点,但我不断收到错误消息:“模型类型的对象不是 JSON 可序列化的”。

我尝试通过list()json.dumps() 传递它,但它可以正常工作。我尝试打印查询,就像

[<Lead: Test>, <Lead: user2>, <Lead: user3>, <Lead: user4>]

这是我写的代码:

def leads(request):
    full = []
    lead_list = list(Lead.objects.all())
    print(lead_list)
    for i in lead_list:
        full.append(json.dumps(i))
    print(full)
    return JsonResponse(list(full), safe=False)

以下是我查看并尝试过的几个问题:

Output Django queryset as JSON

我尝试使用序列化器对其进行序列化,但响应是这样的:

"[{\"model\": \"leads.lead\", \"pk\": 1, \"fields\": {\"first_name\": \"Test\", \"last_name\": \"User\", \"age\": 25, \"city\": \"kolkata\", \"country\": \"India\", \"email\": \"ankr@gmail.com\", \"agent\": 1, \"status\": \"Potential\"}}, {\"model\": \"leads.lead\", \"pk\": 2, \"fields\": {\"first_name\": \"user2\", \"last_name\": \"test2\", \"age\": 44, \"city\": \"Mumbai\", \"country\": \"India\", \"email\": \"test2@gmail.com\", \"agent\": null, \"status\": \"prospect\"}}, {\"model\": \"leads.lead\", \"pk\": 4, \"fields\": {\"first_name\": \"user3\", \"last_name\": \"test3\", \"age\": 19, \"city\": \"Paris\", \"country\": \"France\", \"email\": \"test3@gmail.com\", \"agent\": null, \"status\": \"Prospect\"}}, {\"model\": \"leads.lead\", \"pk\": 8, \"fields\": {\"first_name\": \"user4\", \"last_name\": \"test4\", \"age\": 33, \"city\": \"London\", \"country\": \"UK\", \"email\": \"test4@gmail.com\", \"agent\": null, \"status\": \"Converted\"}}]"

【问题讨论】:

    标签: django sqlite django-models django-views


    【解决方案1】:

    你需要serialize你的查询集然后使用JsonResponse

    class LeadSerializer(serializers.ModelSerializer):
        class Meta:
            model = Lead
            fields = '__all__'
    
    def leads(request):
        qs= Lead.objects.all()
        serializer = LeadSerializer(qs,many=True)
        return JsonResponse(serializer.data, safe=False)
    

    PS:因为我不知道您的 Lead 模型中的列,所以我使用 ModelSerializer 进行序列化,但是您可以使用 serializers.Serializer 编写自己的自定义序列化程序,也可以通过提及您的每一列来像

    class LeadSerializer(serializers.Serializer):
        name = serializer.CharField(max_length=10)
        column_1 = serializer.IntegerField()
    

    【讨论】:

    • 我厌倦了,但是显示了`[OrderedDict(), OrderedDict(), OrderedDict(), OrderedDict()]`
    • 我已经编辑了答案,我忘记在序列化程序中添加类元并将其与模型映射。我自己试过了,它返回了我想要的值
    猜你喜欢
    • 2019-07-11
    • 2013-11-02
    • 2017-11-28
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2019-07-05
    • 2016-08-03
    相关资源
    最近更新 更多