<h2>次优解决方法</h2>
<p><strong>这只是为了文档目的/完整性。向下滚动以获得更好的解决方案</strong></p>
<p>通过一些转换操作,我的问题中的解决方案思想起了作用:</p>
<pre><code>class SensorMeasure(NamedTuple):
temp: float
soilMoisture: float
dateTime: datetime
def test(self):
serializeFields = list(self._fields)
del serializeFields[serializeFields.index('dateTime')]
serialized = OrderedDict(zip(serializeFields, self))
tmp = list(serialized.items())
tmp.append(('dateTime', self.dateTime.isoformat()))
finalDict = OrderedDict(tmp)
return finalDict
</code></pre>
<p>但这不仅仅是datetime序列化的大量代码/工作,这在每个模型中都是必需的。或者至少在每个模型中调用某个助手类</p>
<h3>更好的解决方案:自定义<code>db.save</code>方法</h3>
<p>更好的解决方案是在<code>json.dumps</code>上设置默认解析方法</p>
<pre><code>jsonStr = json.dumps(doc, default = str)
</code></pre>
<p>不幸的是<code>pycouchdb</code>目前<a href="https://github.com/histrio/py-couchdb/blob/164fe373a3d41c539ec1f42915251d726a23c12a/pycouchdb/client.py#L372" rel="nofollow noreferrer">doesn't allow this</a>。当然,我可以发送pull请求,例如通过一个新参数来扩展此功能。但现在,我只是创建了自己的save方法,作为一个快速且合适的修复方法</p>
<pre><code>def save(sensorMeasure):
doc = copy.deepcopy(sensorMeasure._asdict())
doc['_id'] = uuid.uuid4().hex
# Default is important to parse datetime objects
jsonStr = json.dumps(doc, default = str)
data = pycouchdb.utils.force_bytes(jsonStr)
(resp, results) = db.resource(doc['_id']).put(data=data)
</code></pre>
<p>唯一仍然存在的问题是使用<code>db.get()</code>时缺少键入:</p>
<pre><code>doc = db.get("bb29e02dc2364a57ac1e707d7dc2134b")
</code></pre>
<p>这将返回一个字典,因此仍然需要将字符串解析为datetime对象。这可以使用<a href="https://stackoverflow.com/a/1305663/3276634">constructor</a>来完成。不像我所知道的那么简单,例如从ASP.NET Core,序列化/反序列化可以用一行代码完成,但似乎是可能的</p>