首页 > 解决方案 > Django JsonResponse 忽略了自定义编码器

问题描述

我正在使用 Django Rest Framework(版本:django 3.1、djangorestframework 3.11.1、python 3.7)构建一个应用程序

我想覆盖 JsonResponse 中使用的编码器。

我的问题的过度简化:

from django.http import JsonResponse
from django.core.serializers.json import DjangoJSONEncoder

class CustomEncoder(DjangoJSONEncoder):
    def default(self, o):
        return o + 10

response = JsonResponse({"data": 1}, encoder=CustomEncoder)

我期望的response.getvalue()'{"data": 11}',但我得到的是'{"data": 1}'.

我究竟做错了什么 ?

标签: pythonjsondjangoencodingdjango-rest-framework

解决方案


因为 DjangoJSONEncoder 用于

JSONEncoder subclass that knows how to encode date/time, decimal types, and
UUIDs.

您必须传递日期/时间、十进制类型或 UUID 等值,default以便调用您的方法覆盖。

尝试更改为

class CustomEncoder(DjangoJSONEncoder):
    def default(self, o):
        return int(o) + 10

response = JsonResponse({"data": Decimal(1)}, encoder=CustomEncoder)

它将返回 {"data": 11}


推荐阅读