Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何说服JsonResponse序列化自定义类?_Json_Django_Python 3.x_Serialization - Fatal编程技术网

如何说服JsonResponse序列化自定义类?

如何说服JsonResponse序列化自定义类?,json,django,python-3.x,serialization,Json,Django,Python 3.x,Serialization,我将Django3.0.6与Python3.7一起使用 我的视图/控制器返回一个JsonResponse,如下所示: return JsonResponse({ 'My IP string': champion.ip_string, 'Chiefdom full name': chiefdom.FullName(), 'Chiefdom': chiefdom, # This will raise an exception }) 我

我将Django3.0.6与Python3.7一起使用

我的视图/控制器返回一个
JsonResponse
,如下所示:

    return JsonResponse({
        'My IP string': champion.ip_string,
        'Chiefdom full name': chiefdom.FullName(),
        'Chiefdom': chiefdom, # This will raise an exception
    })
我想升级Chiefdom类,使其在
JsonResponse
中表现良好

对我来说,最明显的方法是重写一个方法,
JsonResponse
将调用该方法来序列化它(我猜?它必须,来吧…),但是…我根本找不到任何与此相关的信息

这个问题的全部要点不是修改视图。只修改Chiefdom类本身,然后
JsonResponse
突然决定“哦,现在它确实是可序列化的”

我只能找到涉及修改视图本身的信息,或者更复杂的内容。有大量的不相关信息,如果我要搜索的东西在某个地方,它就埋在一堆堆其他东西下面。

通过指定参数传递自定义编码器

默认情况下,
JsonResponse
使用类

例子:
从django.core.serializers.json导入DjangoJSONEncoder
MyCustomEncoder类(DjangoJSONEncoder):
...
def样本_视图(请求):
返回JsonResponse({
“我的IP字符串”:champion.IP\u字符串,
“Chiefdom全名”:Chiefdom.FullName(),
“酋长国”:酋长国,这将引发一个例外
},encoder=MyCustomEncoder)
感谢

解决方案根本不涉及更改视图(除了更改导入),是这样的:

from django.http import JsonResponse as JsonResponseSuper

class JsonEncoder (DjangoJSONEncoder):
    def default (self, obj):
        if callable(getattr(obj, "toJSON", None)):
            return obj.toJSON()

        return super(obj)

def JsonResponse (obj):
    return JsonResponseSuper(obj,encoder=JsonEncoder)
然后在
Chiefdom
类中创建
toJSON
方法:

    def toJSON (self):
        return {
            'IP': self.ip_string,
            'Name': self.dbObject.name,
        }

@o0’。你在酋长领地有什么?理想情况下,这不重要,因为关键是覆盖它,让它(手动)返回我想要包含在序列化中的内容。但是如果因为我现在无法想象的原因,这很重要,我会编辑。有没有办法修改我的类,让默认的编码器自然地找到序列化它的方法?+1虽然这不能严格地回答问题,但它仍然让我朝着正确的方向前进(我将单独发布我的答案)好了,我不认为有一个自动发现方法可以找到自定义类的成员(它可以是model、form或任何其他无标准oop类)
    def toJSON (self):
        return {
            'IP': self.ip_string,
            'Name': self.dbObject.name,
        }