Python “Django”;JSON不可序列化";-ajax,views.py-如何实现?
我已经阅读了文档,但我不确定如何在my view.py中为JSON对象实现Python “Django”;JSON不可序列化";-ajax,views.py-如何实现?,python,ajax,json,django,serialization,Python,Ajax,Json,Django,Serialization,我已经阅读了文档,但我不确定如何在my view.py中为JSON对象实现serializer.serialize。如果有人能帮我更好地理解这一点。我的view.py中有以下代码: @user_passes_test(lambda u: u.is_superuser) def ProjDetails(request): proj_id = request.GET['proj_id'] proj = Proj.objects.filter(id=proj_id) role_
serializer.serialize
。如果有人能帮我更好地理解这一点。我的view.py中有以下代码:
@user_passes_test(lambda u: u.is_superuser)
def ProjDetails(request):
proj_id = request.GET['proj_id']
proj = Proj.objects.filter(id=proj_id)
role_list = ProjRole.objects.filter(proj=proj)
proj = {
"proj": proj,
"roles": []
}
for r in role_list:
proj['roles'].append(r.id)
return HttpResponse(json.dumps(proj), content_type='application/json; charset=UTF-8')
我正试图用.ajax来调用它(我仍在研究ajax,所以它可能不正确):
一旦JSON调用开始工作,我将更加关注ajax
最大的问题是,我遇到了一个500 http错误:
TypeError at ../proj_details
[<Project: Example>] is not JSON serializable
我唯一不喜欢的是,我实际上必须手动从模型中提取我想要的属性到字典中,而不是从模型中提取所有属性,然后我可以选择在模板中使用哪些属性。我宁愿不必像上面的例子那样把所有的东西都拉出来。'roles'=[]
也给了我一些麻烦,因为当一个proj对象有多个角色时,我似乎无法让它工作
我喜欢尤金的方法,因为它会更干净,但我似乎无法让它与公司的模式一起工作。proj表有一个corp_id,但是当我尝试对proj对象使用.value().get()时,我一直认为corp_id不是一个属性。我也不明白如何实现GRZGRZ3的答案。我通常更多地使用JS、HTML和CSS,而且我还不熟悉Django/python的web开发
因此,任何提高效率的建议都是非常好的。谢谢 无法序列化Django模型的实例,应该使用values()方法来检索dict,而不是类实例。此外,还可以使用only()方法仅检索角色的id字段:
proj = Proj.objects.filter(id=proj_id).values().get()
role_list = ProjRole.objects.only("id").filter(proj__id=proj_id)
proj = {
"proj": proj,
"roles": role_list
}
编写自定义HttpResponse并在其中处理所有不可序列化的python/django对象
class HttpJsonResponse(HttpResponse):
content_type="application/json"
def __init__(self,data):
def json_serial(obj):
"""JSON serializer for objects not serializable by default json code"""
if isinstance(obj, datetime.date):
serial = obj.isoformat()
return serial
json_data = json.dumps(data, indent=4, default=json_serial)
super(HttpJsonResponse, self).__init__(json_data, self.content_type)
在示例函数json_serial
中,将datetime.date
对象转换为可序列化的字符串对象
*更新
你可以混合两种答案
def ProjDetails(request):
proj_id = request.GET['proj_id']
proj = Proj.objects.filter(id=proj_id).values().get()
corp = Corp.objects.filter(id=proj.corp.id).values().get()
role_list = ProjRole.objects.filter(proj=proj).values().all()
proj = {
"proj": proj,
"roles": role_list,
"company": corp
}
return HttpJsonResponse(proj)
确保您正在导入datetime模块
import datetime
而不是datetime类
import datetime.datetime
我的回答如上所述。这就是我的工作
def ProjDetails(request):
def date_handler(obj):
return obj.strftime("%B %d, %Y") if hasattr(obj, 'strftime') else obj
proj_id = request.GET['proj_id']
proj = Proj.objects.get(id=proj_id)
corp = Corp.objects.get(id=proj.corp.id)
role_list = ProjRole.objects.filter(proj=proj).all()
proj = {
"proj": {
'title': proj.title,
'id': proj.id,
'date': proj.date,
'description': proj.description
}
"roles": [],
"company": {
'name': corp.name,
'pic': unicode(corp.pic),
}
}
for r in role_list:
proj['roles'].append(r.name)
return HttpResponse(json.dumps(proj, default=date_handler), content_type='application/json; charset=UTF-8')
然后我得到一个ValueError:
无效的文本,对于int(),以10为基数:
这可能与数据库中的实际数据有关?我还看到了一些关于使用list()的内容。这有必要吗?谢谢你的回复。现在我得到了一个AttributeError,上面说“Proj”对象没有属性“values”。对不起,我忘了values()只适用于QuerySet,我再次编辑了答案。我真的认为有一种更简单的方法可以做到这一点。现在我看到datetime.date有一个TypeError,这是很常见的。我现在正试图弄明白这一点。我想我不明白为什么Django模型的实例不能序列化。是否有相关文档的链接?这可能会有所帮助?视图中是否有实现此功能的示例?我仍然无法通过此命令传递“is not JSON serializable”错误,或者我得到一个关于isinstance需要2个参数的错误。我在使用您的示例时得到了这个错误:isinstance()arg 2必须是类、类型或类和类型的元组
是否在JSON_serial
函数中添加了自定义if语句?如果是的话,展示出来。我在上面编辑了我的帖子。这就是我的结局。我唯一不喜欢它的地方是我不得不使用.get(),这让我不得不手动从模型中提取所有变量。因此,任何关于提高效率的建议都是非常好的。谢谢,但是我无法让object.filter()方法正常工作。我不断得到“dict”对象没有属性“corp”
。然后我把它改为proj.corp_id,我仍然得到了一个类似的错误。然后我尝试更改get()、all()等,尝试不同的变体,但我无法让它工作。我真的不知道为什么。
import datetime.datetime
def ProjDetails(request):
def date_handler(obj):
return obj.strftime("%B %d, %Y") if hasattr(obj, 'strftime') else obj
proj_id = request.GET['proj_id']
proj = Proj.objects.get(id=proj_id)
corp = Corp.objects.get(id=proj.corp.id)
role_list = ProjRole.objects.filter(proj=proj).all()
proj = {
"proj": {
'title': proj.title,
'id': proj.id,
'date': proj.date,
'description': proj.description
}
"roles": [],
"company": {
'name': corp.name,
'pic': unicode(corp.pic),
}
}
for r in role_list:
proj['roles'].append(r.name)
return HttpResponse(json.dumps(proj, default=date_handler), content_type='application/json; charset=UTF-8')