首先,desktopcouch.records.server.CouchDatabase的一个奇怪的行为:
db.get_record(id)
返回:
<desktopcouch.records.RecordDict object at 0x9198f2c>
db.get_records('mytype', True)
返回数组:
<Row id='5rMlni6ZYudp5gvSADve1Y', key='mytype', ...>
db为CouchDatabase('mydb', create=True)
为什么会出现这种差异?
这导致我的dict被保存在记录中作为空dict {},首先是<desktopcouch.records.RecordDict object at 0x9198f2c>
,第二种情况下是{}。
使用db.get_record(id)获取并使用db.update_fields(id,record)进行更新时会出现一些问题。抛出''Document'对象没有属性'read''
我在哪里做错了?
编辑:
我向Desktop CouchDB发布了一个错误,其中包含解释和摘要以重现此行为https://bugs.launchpad.net/desktopcouch/+bug/905913
答案 0 :(得分:1)
通过查看它的代码,我发现它不是一个普通的字典,但无论如何你都可以把它变成dict。
试试这个:
print dict(tmp['logs'].items())
修改强>
至于混淆,当您将转换后的dict设置回Record
对象时,它会运行
super(Record, self).__setitem__(key, item)
因此,根据其继承,它运行RecordDict
对象的__setitem__
方法,该方法运行:
super(RecordDict, self).__setitem__(key, item)
再次,请参阅RecordData
对象的__setitem__
方法,它是:
def __setitem__(self, key, item):
if isinstance(item, (list, tuple, dict)):
item = record_factory(item)
if hasattr(item, '_data'):
item = item._data
self._data[key] = item
因此,它使用record_factory
将您解析的字典再次转换为RecordDict
。所以你看到了那些结果:)