0

我想为我的 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 字符串 get 全部逃逸)。那么我需要在 Javascript 中再次对其进行 json_decode 。

此外,django 序列化函数只接受对象列表,所以我必须创建一个只有一个对象的列表,当我反序列化它时,它会采用列表的第一个值(这不是一个超级大问题,但它添加直到堆)。

如果您可以将模型序列化为python dict,那就太好了。然后你可以随心所欲地用它做任何事情。

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

4

3 回答 3

2

您可以序列化为 Python dict 并将其传递给转换为 JSON:

qs_as_dict = serializers.serialize('python', qs)
results['objects'] = qs_as_dict
于 2012-12-23T23:31:52.103 回答
1

与其返回模型对象,不如只返回响应所需的值?

results.update({'account': {'id': account.id, 'title': account.title}})
于 2012-12-23T22:51:12.053 回答
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。

于 2012-12-24T00:41:38.183 回答