代码之家  ›  专栏  ›  技术社区  ›  theycallmemorty

Django模型不可Ajax序列化

  •  10
  • theycallmemorty  · 技术社区  · 15 年前

    我有一个简单的视图,我用它来试验Ajax。

    def get_shifts_for_day(request,year,month,day):
    
        data= dict()
        data['d'] =year
        data['e'] = month
        data['x'] = User.objects.all()[2]
    
        return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
    

    这将返回以下内容:

    TypeError at /sched/shifts/2009/11/9/
    
    <User: someguy> is not JSON serializable
    

    如果我取出数据['x']行,这样我就不会引用它工作的任何模型,并返回这个:

    {"e": "11", "d": "2009"}
    

    为什么simplejson不能解析我的默认django模型?我使用的任何模型都有同样的行为。

    1 回复  |  直到 15 年前
        1
  •  29
  •   Alex Martelli    15 年前

    你只需要在你的 .dumps 调用,A default=encode_myway 让论点 simplejson 知道当你传递不知道类型的数据时该怎么做——你的“为什么”问题的答案当然是你没有 告诉 贫穷的 普莱斯杰森 如何处理模型的一个实例。

    当然你需要写 encode_myway 提供JSON可编码数据,例如:

    def encode_myway(obj):
      if isinstance(obj, User):
        return [obj.username,
                obj.firstname,
                obj.lastname,
                obj.email]
        # and/or whatever else
      elif isinstance(obj, OtherModel):
        return [] # whatever
      elif ...
      else:
        raise TypeError(repr(obj) + " is not JSON serializable")
    

    基本上,JSON知道非常基本的数据类型(字符串、int和float,分为dict和list)——作为一个应用程序程序员,您有责任将其他所有数据与这些基本数据类型进行匹配,以及 普莱斯杰森 通常是通过传递给 default= dump dumps 时间。

    或者,您可以使用 json 序列化程序是Django的一部分,请参见 the docs .