【问题标题】:Django models are not ajax serializableDjango 模型不是 ajax 可序列化的
【发布时间】:2010-11-30 06:34:16
【问题描述】:

我有一个简单的视图,我用它来试验 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

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

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

为什么 simplejson 不能解析我的默认 django 模型之一?我使用的任何模型都会出现相同的行为。

【问题讨论】:

  • 模棱两可的问题,实际上不是问题标题中的问题

标签: ajax django json django-models django-views


【解决方案1】:

您只需要在您的.dumps 调用中添加一个default=encode_myway 参数,让simplejson 知道当您传递它不知道类型的数据时该怎么做——您的“为什么”的答案问题当然是你没有告诉可怜的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 知道非常基本的数据类型(字符串、整数和浮点数,分组为 dict 和列表)——作为应用程序程序员,您有责任将其他所有内容与这些基本数据类型相匹配,在 @987654328 中@ 这通常通过在dumpdumps 时间传递给default= 的函数来完成。

或者,您可以使用 Django 中的json 序列化程序,请参阅the docs

【讨论】:

  • django 不能足够聪明地知道哪些属性对最终用户真正重要(当然基于用户在模型中定义的属性)并在默认情况下减少 a## 中的这种痛苦?
猜你喜欢
  • 2019-12-27
  • 2021-11-27
  • 2018-03-21
  • 2014-10-02
  • 2014-12-23
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多