<p>这个问题有两种可能的解决办法。NDevox已经提到了如何重写<code>retrive</code>函数并获得预期的响应。但是如果我们希望每个<code>api</code>端点的每个响应都这样做,如果我们这样做,我们需要覆盖每个函数,那么它的负担和<code>DRY</code>我们应该尽量避免这种情况。引入中间件或重写<code>Response</code>的一种可能的方法,这样我们就可以在不显式地覆盖每个功能的情况下获得每个api端点的通用响应。在</p>
<h3>可能的解决方案一</h3>
<p>当我们在这里使用<code>DRF</code>时,我们可以使用各种媒体类型添加我们自己的返回响应,比如针对<code>application/json</code>。在</p>
<p>首先我们需要添加设置.py在</p>
<pre><code>REST_FRAMEWORK = {
...
'DEFAULT_RENDERER_CLASSES': (
'app_name.renderers.ApiRenderer', # our own render middleware
),
...
}
</code></pre>
<p>在我们的定制渲染中间件中</p>
^{pr2}$
<p>参考<a href="https://www.django-rest-framework.org/api-guide/renderers/" rel="nofollow noreferrer">Link</a></p>
<h3>可能的解决方案二</h3>
<p>如果我们使用<code>ModelViewset</code>,那么还有另一种方法可以实现这一点。说我们的视图.py就像下面这些</p>
<pre><code>class A(serializer.ModelSerializer):
........
class B(serializer.ModelSerializer):
........
class C(serializer.ModelSerializer):
........
</code></pre>
<p>我们的目标是重写<code>ModelViewset</code>的to\u表示函数并返回我们的自定义结果。这将如下所示</p>
<pre><code>from collections import OrderedDict
class OurParentViewset(serializer.ModelSerializer):
......
def to_representation(self, instance):
data = super(serializers.ModelSerializer, self).to_representation(instance)
result = OrderedDict()
result['data'] = data
result['version'] = '1.0'
result['statusCode'] = '2xx' # i am not fully sure how to customize this
return result
class A(OurParentViewset):
........
class B(OurParentViewset):
........
class C(OurParentViewset):
........
</code></pre>