博客五部曲之三 - 博客RESTful


1341 浏览 5 years, 2 months

23 Update & Destroy Mixins 混入类

版权声明: 转载请注明出处 http://www.codingsoho.com/

Update & Destroy Mixins

接下来我们会实现comments的操作,包括编辑和修改。
这一节我们使用的方式是mixin http://www.django-rest-framework.org/api-guide/generic-views/#mixins ,基于DetailView添加Mixin来实现相应的功能

基于DetailView基础,添加DestroyModelMixin和UpdateModelMixin,并添加put和delete方法来实现更新和删除。如果你是在UpdateAPIView里面添加RetrieveMixin,这儿需要添加get方法。

comments/api/views.py

from rest_framework.mixins import DestroyModelMixin, UpdateModelMixin

class CommentEditAPIView(DestroyModelMixin, UpdateModelMixin, RetrieveAPIView):
    queryset = Comment.objects.filter(id__gte=0)
    serializer_class = CommentDetailSerializer
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

添加URL

comments/api/urls.py

    url(r'^(?P<pk>\d+)/edit/$', CommentEditAPIView.as_view(), name='edit'), #delete
]

访问 http://127.0.0.1:8000/api/comments/53/edit,可以看到Delete按钮和更新区域都出现了

前面的view中我们使用的还是Retrieve Serializer,接下来实现它自己的Serializer,去掉那些不想被编辑的field

comments/api/serializers.py

class CommentEditSerializer(ModelSerializer):
    class Meta:
        model = Comment
        fields = [
            'id',
            'content',
            'timestamp',
        ]

同时更新view里的Serializer

class CommentEditAPIView(DestroyModelMixin, UpdateModelMixin, RetrieveAPIView):

<span class="n">queryset</span> <span class="o">=</span> <span class="n">Comment</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__gte</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
serializer_class = CommentEditSerializer

再次刷新编辑页面,就会看到只有内容可以编辑了

如果执行删除操作,注意,跟admin后台删除一样,它会删除它的所有子评论,因为有ForeignKey关联

比如上面的53删除了,它的子评论54也会自动删除,下图可以看到他们的依赖关系