我正在开发一个非常简单的应用程序,作为将MongoDB与web2py集成的用例。在应用程序的一个部分中,我有兴趣返回产品列表:
我的数据库表:
db.define_table('products',
Field('brand', label='Brand'),
Field('photo', label='Photo'),
...
Field('options', label='Options'))
我的控制器:
def products():
qset = db(db['products'])
grid = qset.select()
return dict(grid=grid)
我的观点:
{{extend 'layout.html'}}
<h2>Product List</h2>
{{=grid}}
退货时产品没有问题。然而,产品_id字段以'26086541625969213357181461154'的形式返回值。如果我切换到shell(或python)并尝试基于这些_id查询我的数据库,我将找不到任何产品。
正如您所料,数据库中的_id是ObjectId,看起来像"544a481b2ceb7c3093a173a2"。我希望我的视图返回ObjectId,而不是长字符串。很简单,但我遇到了麻烦。
为给定MongoDB记录构造DAL Row
对象时,ObjectId通过long(str(value), 16)
转换为long
整数来表示。要转换回ObjectId,可以使用MongoDB适配器的object_id
方法:
object_id = db._adapter.object_id('26086541625969213357181461154')
当然,如果您使用DAL查询MongoDB,您不必担心这一点,因为它会自动处理转换。
虽然这很有道理,但我没能让安东尼的答案奏效。所以,我只是黑了它:
hex(value).replace("0x","").replace("L","")