我想通过 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,所以无论如何我都必须将序列化的数据转换为模式。