如何说服JsonResponse序列化自定义类?
我将Django3.0.6与Python3.7一起使用 我的视图/控制器返回一个如何说服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 }) 我
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,
}