【问题标题】:Django model as part of Ajax responseDjango 模型作为 Ajax 响应的一部分
【发布时间】:2012-12-10 12:27:59
【问题描述】:

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

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

【问题讨论】:

  • 考虑使用适当的 API 模块,例如 django-tastypie.readthedocs.org
  • 内部使用的 API?这不是矫枉过正吗?还是常用的?
  • 我没有注意到这是供内部使用的,抱歉。无论如何都要考虑 API ;)

标签: python django json serialization model


【解决方案1】:

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

qs_as_dict = serializers.serialize('python', qs)
results['objects'] = qs_as_dict

【讨论】:

  • 嘿,这太酷了!不知道您可以序列化为 python dict(在文档中找不到)。有了这些信息,我能够找到解决方案(请参阅我的答案)。谢谢!
【解决方案2】:

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

results.update({'account': {'id': account.id, 'title': account.title}})

【讨论】:

  • 这是可能的,但是如果您有一个大模型,或者如果您需要在多个模型上执行此操作,并且每次更改模型时都应该更改 Ajax,则可能需要做很多工作也有回应。
  • 我不同意。让我们假设您是否能够返回模型。后来你改变了模型,你仍然需要更新你在前端使用的方法。而且通常不需要太多信息就可以在 ajax 调用中发回。
  • 你说得有道理。也许我应该更多地根据我的电话要求来写我的回复。大多数时候我只是喜欢把事情抽象化。
【解决方案3】:

在丹尼尔的回答的帮助下,我能够做到:

def get_account_data(account):
    fields = serializers.serialize('python', [account, ])[0]['fields']
    return {field: str(fields[field]) for field in fields}

因为我是通过 Ajax 发送的,所以我需要所有内容都是字符串。如果您使用“python”方法进行序列化,则日期时间字段之类的某些内容中将包含一个函数(例如datetime.date(2012, 12, 23))。这个函数创建一个只有字符串值的字典。

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 2011-06-10
    • 1970-01-01
    • 2013-04-13
    • 2014-07-15
    • 2015-12-23
    • 2011-08-22
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多