1

我想通过 http 在 Django-nonrel+MongoDB 和移动设备之间交换信息。当移动设备向 api 发出请求时,Django 视图执行查询,我想用查询结果的序列化来响应。

我的问题是Django 的内置序列化格式不能很好地与包含嵌入式聚合和列表的模型配合使用。我可以通过不使用这些 no-sql 特性来解决这个问题,但这会首先抵消我使用 MongoDB 的动机。

从 MongoDB 查询中序列化数据的最佳方法是什么?

我知道我可以导入 bson 并使用“编码”和“解码”功能,但这些似乎只适用于字典。我当前不雅的视图测试代码从底层模型中生成了一个繁琐的嵌入式字典结构:

def get_announcements(request):
  """
  Return a BSON representation of the ten most recent announcements relevant to the
  user.
  """
  user = User.objects.get(username='*<somebody>*') # Test User for now
  campaign_announcements = Campaign.objects.filter(workers=user.id)[:10]
  data = {}
  for campaign in campaign_announcements:
    data[campaign.name] = []
    for announcement in campaign.announcements:
      data[campaign.name].append({
          'tagline': announcement.tagline,
          'content': announcement.content,
          'release_time': announcement.release_time,
        })
  return HttpResponse(BSON.encode(data))

我希望能够做到这一点:

return HttpResponse(serializers.serialize("bson", <query>))

这假设 bson 是我应该使用的格式。我假设这是因为它是 MongoDB 的默认格式。

对其他问题的回答提到了 PyMongo 的 json_util 子模块。我看着它,但我不认为它做我想做的事。

谢谢!

2013 年 8 月 20 日更新:感谢那些回答我问题的人。我决定放弃 no-sql。它似乎是一种有趣且有用的技术,但它似乎不能很好地与我的环境配合使用:Django、Heroku 和 Android。让嵌入式对象以一种有用的方式进行序列化似乎需要一些我宁愿避免的黑客行为,而 Android 使用 SQLite,所以无论如何我都必须将序列化的数据转换为模式。

4

3 回答 3

0

我有一个类似的问题,发现使用:

.to_json()

关于查询。

也许对像我这样的未来潜伏者有用。

于 2014-01-23T18:37:24.663 回答
0

我建议您查看一下,json_util因为这会将 bson 查询结果转换为扩展的 json格式,您应该能够在您的移动应用程序中轻松处理。

另一种方法是在 bson 中进行通信,并在您的移动应用程序中处理与二进制文件之间的解码。

于 2013-08-19T10:21:40.953 回答
0

尝试研究 django-tastypie。它有一些内置的序列化程序,它是一个 REST API,用于根据您的 Django 模型进行查询。

于 2013-07-22T00:43:06.027 回答