自定义的视图及一个bug

2018-12-14  本文已影响0人  aq_wzj

基于rest_framework的方式https://www.cnblogs.com/liuqingzheng/articles/9766382.html

自定义的方式

写一个类继承APIView
将get,post,delete,put方法,写在这个里面

class MyAPI(APIView):
    # 将APIView的as_view拷过来然后把 if 判断里面的东西删掉
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(APIView, cls).as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs

        # Note: session based authentication is explicitly CSRF validated,
        # all other authentication is CSRF exempt.
        return csrf_exempt(view)

    def get(self, request, *args, **kwargs):
        if kwargs:
            pk = kwargs['pk']
            book = self.queryset.filter(pk=pk).first()
            res = self.serializer_class(instance=book, many=False)
        else:
          ==========================================================
          /  book = self.queryset.all()       这个部分注意!!!!!!!!! /
          /  res = self.serializer_class(instance=book, many=True) /
          ==========================================================
        return JsonResponse(res.data, safe=False)

    def post(self, request):
        res = self.serializer_class(data=request.data)
        if res.is_valid():
            res.save()
            return JsonResponse({'status': 100, 'msg': '添加成功'})
        else:
            return JsonResponse({'status': 101, 'msg': res.errors})

    def put(self, request, pk):
        book = self.queryset.filter(pk=pk).first()
        res = self.serializer_class(data=request.data, instance=book)
        if res.is_valid():
            res.save()
            self.queryset = models.Book.objects.all()
            return JsonResponse({'status': 100, 'msg': '修改成功'})
        else:
            return JsonResponse({'status': 10, 'msg': res.errors})

    def delete(self, request, pk):
        self.queryset.filter(pk=pk).delete()
        return JsonResponse({'status': 100, 'msg': '删除成功'})

视图类继承上面自定义的类

class PublishDetail(MyAPI):
    # 将这个queryset值给类的属性,在上面类里面就可以拿到
    queryset = models.Publish.objects.all()  
    
    # mySer.Publish是我序列化的类
    serializer_class = mySer.Publish
    
class Books(MyAPI):
    queryset = models.Book.objects.all()
    serializer_class = mySer.BookSerializer

路由

url(r'^books/$', views.Books.as_view()),
url(r'^books/(?P<pk>\d+)$', views.Books.as_view()),
    
url(r'^publish/$', views.PublishDetail.as_view()),
url(r'^publish/(?P<pk>\d+)$', views.PublishDetail.as_view()),
   

记一个BUG

MyAPI类里方框框起来的代码

我之前是这么写的

res = self.serializer_class(instance=self.queryset, many=True)

导致的问题是, 在添加删除修改数据以后, 查看全部的时候不会更新数据, 还是修改前的数据, 需要项目重启以后才会更新

但是查看那个删除的单个数据时却是none

简单说bug就是
朝http://127.0.0.1:8000/publish/14 发送了delete请求
查看确实数据库删除了 14

但是朝http://127.0.0.1:8000/publish/发get请求还能查看到 14
但是朝http://127.0.0.1:8000/publish/14 发get请求
        返回的却是none

分析,

在视图类中已经给定self.queryset = models.Publish.objects.all()
查看单个数据 self.queryset.filter(pk=pk).first()
查看全部数据 直接 self.queryset

bug所在:

查看单个数据时.filter(pk=pk).first()并不是在原来的self.queryset上进行的,而是再去数据库查了一次

查看全部数据时self.queryset值并没有更新,

解决方法,:

查看全部数据时再次在self.queryset后面加上.all(),

这样就会再次去数据库里面查一次,也就是更新了数据

上一篇 下一篇

猜你喜欢

热点阅读