class V2Book(APIView):
# 单整体改: 对 v2/books/(pk)/ 传的数据是与model对应的字典{name|price|publish|authors}
def put(self, request, *args, **kwargs):
request_data = request.data
pk = kwargs.get('pk')
old_book_obj = models.Book.objects.filter(pk=pk).first() # 通过源码我们知道instance不为none的时候才会走save()中的update,若依我们要拿到这个要更新数据的对象,把它赋给instanc
# 目的:将众多数据的校验交给序列化类来处理 - 让序列化类扮演反序列化角色,校验成功后,序列化类来帮你入库
book_ser = serializers.V2BookModelSerializer(instance=old_book_obj, data=request_data, partial=False)
book_ser.is_valid(raise_exception=True)
# 校验通过,完成数据的更新:要更新的目标,用来更新的新数据
book_obj = book_ser.save()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: serializers.V2BookModelSerializer(book_obj).data
})</div></div><div id="mCSB_2_scrollbar_vertical" class="mCSB_scrollTools mCSB_2_scrollbar mCS-minimal-dark mCSB_scrollTools_vertical" style="display: block;"><div class="mCSB_draggerContainer"><div id="mCSB_2_dragger_vertical" class="mCSB_dragger" style="position: absolute; min-height: 50px; height: 281px; top: 0px; display: block; max-height: 301px;"><div class="mCSB_dragger_bar" style="line-height: 50px; background-color: rgb(212, 208, 171);"></div></div><div class="mCSB_draggerRail"></div></div></div><div id="mCSB_2_scrollbar_horizontal" class="mCSB_scrollTools mCSB_2_scrollbar mCS-minimal-dark mCSB_scrollTools_horizontal" style="display: block;"><div class="mCSB_draggerContainer"><div id="mCSB_2_dragger_horizontal" class="mCSB_dragger" style="position: absolute; min- 50px; display: block; 501px; max- 806px; left: 0px;"><div class="mCSB_dragger_bar" style="background-color: rgb(212, 208, 171);"></div></div><div class="mCSB_draggerRail"></div></div></div></pre>
class V2Book(APIView):
# 单局部改:对 v2/books/(pk)/ 传的数据,数据字段key都是选填
# 群局部改:对 v2/books/
# 请求数据 - [{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}]
def patch(self, request, *args, **kwargs):
request_data = request.data
pk = kwargs.get('pk')
<span class="hljs-comment"># 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据]</span>
<span class="hljs-keyword">if</span> pk <span class="hljs-keyword">and</span> isinstance(request_data, dict): <span class="hljs-comment"># 单改</span>
pks = [pk, ]
request_data = [request_data, ]
<span class="hljs-keyword">elif</span> <span class="hljs-keyword">not</span> pk <span class="hljs-keyword">and</span> isinstance(request_data, list): <span class="hljs-comment"># 群改</span>
pks = []
<span class="hljs-keyword">for</span> dic <span class="hljs-keyword">in</span> request_data: <span class="hljs-comment"># 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典</span>
<span class="hljs-comment">#从拿出来的一个个字段中弹出pk的值,如果没有就返回None</span>
pk = dic.pop(<span class="hljs-string">'pk'</span>, <span class="hljs-keyword">None</span>)
<span class="hljs-comment"># 下面的作用是将pk的值添加到pks中,如果为None的话,直接返回异常,所以能走下的pks和request_data中的数据是一一对应的</span>
<span class="hljs-keyword">if</span> pk:
pks.append(pk)
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'数据有误'</span>,
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'数据有误'</span>,
})
<span class="hljs-comment"># pks与request_data数据筛选,</span>
<span class="hljs-comment"># 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除</span>
<span class="hljs-comment"># 2)将合理的pks转换为 objs</span>
objs = []
new_request_data = []
<span class="hljs-keyword">for</span> index, pk <span class="hljs-keyword">in</span> enumerate(pks):
<span class="hljs-keyword">try</span>:
<span class="hljs-comment"># pk对应的数据合理,将合理的对象存储</span>
obj = models.Book.objects.get(pk=pk)
objs.append(obj)
<span class="hljs-comment"># 对应索引的数据就需要保存下来</span>
new_request_data.append(request_data[index])
<span class="hljs-keyword">except</span>:
<span class="hljs-comment"># 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除</span>
<span class="hljs-comment"># index = pks.index(pk)</span>
<span class="hljs-comment"># request_data.pop(index)</span>
<span class="hljs-keyword">continue</span>
book_ser = serializers.V2BookModelSerializer(instance=objs, data=new_request_data, partial=<span class="hljs-keyword">True</span>, many=<span class="hljs-keyword">True</span>)
book_ser.is_valid(raise_exception=<span class="hljs-keyword">True</span>)
book_objs = book_ser.save()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: serializers.V2BookModelSerializer(book_objs, many=<span class="hljs-keyword">True</span>).data
})</div></div><div id="mCSB_4_scrollbar_vertical" class="mCSB_scrollTools mCSB_4_scrollbar mCS-minimal-dark mCSB_scrollTools_vertical mCSB_scrollTools_onDrag" style="display: block;"><div class="mCSB_draggerContainer"><div id="mCSB_4_dragger_vertical" class="mCSB_dragger mCSB_dragger_onDrag" style="position: absolute; min-height: 50px; display: block; height: 79px; max-height: 301px; top: 67px;"><div class="mCSB_dragger_bar" style="line-height: 50px; background-color: rgb(212, 208, 171);"></div></div><div class="mCSB_draggerRail"></div></div></div><div id="mCSB_4_scrollbar_horizontal" class="mCSB_scrollTools mCSB_4_scrollbar mCS-minimal-dark mCSB_scrollTools_horizontal" style="display: block;"><div class="mCSB_draggerContainer"><div id="mCSB_4_dragger_horizontal" class="mCSB_dragger" style="position: absolute; min- 50px; display: block; 717px; max- 806px; left: 0px;"><div class="mCSB_dragger_bar" style="background-color: rgb(212, 208, 171);"></div></div><div class="mCSB_draggerRail"></div></div></div></pre>
总结
序列化流程小结