Django模型作为Ajax响应的一部分

时间:2012-12-23 22:46:40

标签: python django json serialization model

我想在我的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,那就太棒了。然后你可以随心所欲地做任何事情。

有人遇到过同样的问题吗?你是怎么解决的?

3 个答案:

答案 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只包含字符串值。