我想在我的Ajax请求的响应中放入一个Django模型。目前我在views.py中有这个:
def get_account(request, account_id):
try:
account = Account.objects.get(pk=account_id)
success = True
error_message = None
except Account.DoesNotExist:
success = False
error_message = 'This account does not exist'
results = {
'success': success,
'error_message': error_message,
}
return HttpResponse(
json.dumps(results),
mimetype='application/json')
我想将account
模型添加到results
字典中。 account.__dict__
不会这样做,因为它会引用其中的其他对象。
我找到了de django serialize function,它按照我想要的方式将它序列化,只是它直接生成一个Json字符串,所以我最终会在Json对象中找到一个Json字符串(如果你有的话,对于带宽不好)大型模型,因为Json字符串得到了全部的转义。那么我需要在Javascript中再次json_decode它。
此外,django序列化函数只接受对象列表,所以我必须创建一个只有一个对象的列表,当我反序列化它时,取列表的第一个值(这不是一个超级大问题,但它累积起来。)
如果您可以将模型序列化为python dict,那就太棒了。然后你可以随心所欲地做任何事情。
有人遇到过同样的问题吗?你是怎么解决的?
答案 0 :(得分:2)
您可以序列化为Python dict并将其传递以转换为JSON:
qs_as_dict = serializers.serialize('python', qs)
results['objects'] = qs_as_dict
答案 1 :(得分:1)
而不是返回模型对象,为什么不直接返回响应所需的值?
results.update({'account': {'id': account.id, 'title': account.title}})
答案 2 :(得分:0)
在丹尼尔回答的帮助下,我能够做到:
def get_account_data(account):
fields = serializers.serialize('python', [account, ])[0]['fields']
return {field: str(fields[field]) for field in fields}
因为我是通过Ajax发送的,所以我需要一切都是字符串。如果使用'python'方法序列化,那么像datetime字段这样的东西就会有一个函数(比如datetime.date(2012, 12, 23)
)。此函数使dict只包含字符串值。