Python “Django”;JSON不可序列化";-ajax,views.py-如何实现?

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_

我已经阅读了文档,但我不确定如何在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_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')