<p><code>Serializer.data</code>属性返回使用<code>serializer._data</code>构造的<code>OrderedDict</code>。返回值不是<code>serializer._data</code>本身。</p>
<p>因此,更改<code>serializer.data</code>的返回值不会更改<code>serializer._data</code>成员。因此,对<code>serializer.data</code>的以下调用不会更改。</p>
<pre class="lang-py prettyprint-override"><code># In class Serializer(BaseSerializer)
@property
def data(self):
ret = super(Serializer, self).data
return ReturnDict(ret, serializer=self)
# In class ReturnDict(OrderedDict)
def __init__(self, *args, **kwargs):
self.serializer = kwargs.pop('serializer')
super(ReturnDict, self).__init__(*args, **kwargs)
</code></pre>
<p>您可以保留<code>serializer.data</code>的返回值(这是一个有序字典)的副本,并根据需要对其进行操作。</p>
<p>示例:
</p>
<pre><code># keep the return value of serializer.data
serialized_data = serializer.data
# Manipulate it as you wish
serialized_data['test'] = 'I am cute'
# Return the manipulated dict
return Response(serialized_data)
</code></pre>
<p>原因:</p>
<p>如果您查看Django Restframework的源代码,您将在<code>Serializer</code>类中看到</p>
<ul>
<li><code>Serializer._data</code>只是一本普通的字典。</li>
<li><code>Serializer.data</code>是一个修饰为类似于属性的方法。它返回一个<code>ReturnDict</code>对象,这是一个从<code>OrderedDict</code>派生的自定义类。返回的<code>ReturnDict</code>对象使用<code>Serializer._data</code>中的键/值对初始化。</li>
</ul>
<p>如果<code>Serializer.data</code>直接返回<code>Serializer._data</code>,则原始方法将按预期工作。但它不会工作,因为它返回了另一个使用<code>Serializer._data</code>构造的类似字典的对象。</p>
<p>请记住,<code>Serializer.data</code>的返回值不是<code>Serializer._data</code>,而是一个类似于有序字典的对象。操作返回值不会改变<code>Serializer._data</code>。</p>
<p>我认为<code>serializer.data</code>不直接返回<code>serializer._data</code>的原因是为了避免数据的意外更改,并返回<code>serializer._data</code>的漂亮表示。</p>