【问题标题】:Convert multiple querysets to json in django在 django 中将多个查询集转换为 json
【发布时间】:2012-03-27 20:01:30
【问题描述】:

我问了related question earlier today

在这种情况下,我有 4 个查询集结果:

action_count = Action.objects.filter(complete=False, onhold=False).annotate(action_count=Count('name'))
hold_count = Action.objects.filter(onhold=True, hold_criteria__isnull=False).annotate(action_count=Count('name'))
visible_tags = Tag.objects.filter(visible=True).order_by('name').filter(action__complete=False).annotate(action_count=Count('action'))
hidden_tags = Tag.objects.filter(visible=False).order_by('name').filter(action__complete=False).annotate(action_count=Count('action'))

我想将它们返回给 ajax 函数。我必须将它们转换为 json,但我不知道如何在同一个 json 字符串中包含多个查询集。

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    我知道这个线程很旧,但是使用 simplejson 来转换 django 模型在很多情况下都不起作用,比如小数(如上面的 rebus 所述)。

    正如 django 文档中所述,序列化程序看起来是更好的选择。

    Django 的序列化框架提供了一种机制 将 Django 模型“翻译”成其他格式。通常这些其他 格式将基于文本并用于通过 线,但序列化程序可以处理任何格式 (是否基于文本)。

    Django Serialization Docs

    【讨论】:

      【解决方案2】:

      您可以使用 Django 的 simplejson 模块。此代码未经测试!

      from django.utils import simplejson
      dict = {
          'action_count': list(Action.objects.filter(complete=False, onhold=False).annotate(action_count=Count('name')).values()),
          'hold_count': list(Action.objects.filter(onhold=True, hold_criteria__isnull=False).annotate(action_count=Count('name')).values()),
          ...
      }
      return HttpResponse( simplejson.dumps(dict) )
      

      如果有时间,我会根​​据需要测试和重写代码,但这应该可以帮助您入门。

      【讨论】:

      • 这实际上行不通。你不能像这样序列化 Django 查询集,因为模型实例本身不能被 json 模块直接序列化。
      • 好的,谢谢提示!我只是重新编写了代码。现在,实际的字典列表是动态创建的。它应该可以工作 - 但它仍然未经测试。也许这不是最优雅的方式......
      • 您可以使用 values()values_list() 而不是那样构建字典,特别是因为如果任何字段是 ForeingKey 或其他字段,它将再次返回一个不可序列化的对象。以json.dumps(list(Model.object.filter().values())) 为例。
      • 不确定这是否适用于十进制字段。
      • 谢谢大家。我对此进行了一些破解,但从这里的 cmets 中得到了一个可行的解决方案。
      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2020-11-14
      • 2019-07-14
      • 2021-11-08
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多