Django 模型不是 ajax 可序列化的
Posted
技术标签:
【中文标题】Django 模型不是 ajax 可序列化的【英文标题】:Django models are not ajax serializable 【发布时间】: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 模型之一?我使用的任何模型都会出现相同的行为。
【问题讨论】:
模棱两可的问题,实际上不是问题标题中的问题 【参考方案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 中@ 这通常通过在dump
或dumps
时间传递给default=
的函数来完成。
或者,您可以使用 Django 中的json
序列化程序,请参阅the docs。
【讨论】:
django 不能足够聪明地知道哪些属性对最终用户真正重要(当然基于用户在模型中定义的属性)并在默认情况下减少 a## 中的这种痛苦?以上是关于Django 模型不是 ajax 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的
“Mycart”类型的对象在 Django 中不是 JSON 可序列化的
TypeError:“TopicSerializer”类型的对象不是 JSON 可序列化的 Django
图书管理的图书增删改查choices参数MTV与MVC模型多对多关系的三种创建方式Ajax操作前后端传输数据编码格式ajax发送json格式数据ajax发送文件django自带的序列化
图书管理的图书增删改查choices参数MTV与MVC模型多对多关系的三种创建方式Ajax操作前后端传输数据编码格式ajax发送json格式数据ajax发送文件django自带的序列化