串行化Django-nonrel + MongoDb查询以与移动设备交换的最佳方法?

时间:2013-07-21 16:06:16

标签: api mongodb web-applications django-nonrel bson

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

我的问题是Django's built-in serialization格式与包含嵌入式聚合和列表的模型不兼容。我可以通过不使用这些no-sql功能解决这个问题,但这会使我首先使用MongoDB的动机无效。

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

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

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's json_util submodule的其他问题。我看着它,但我认为它没有做我想做的事。

谢谢!

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我遇到了类似的问题并且发现使用了:

.to_json()
查询上的

对于这个问题,未来的潜伏者可能会像我一样有用。