美文网首页
自定义的视图及一个bug

自定义的视图及一个bug

作者: aq_wzj | 来源:发表于2018-12-14 20:13 被阅读0次

基于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(),

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

相关文章

  • 自定义的视图及一个bug

    基于rest_framework的方式https://www.cnblogs.com/liuqingzheng/a...

  • SYAlertView弹窗视图

    SYAlertView自定义弹窗子视图UI根据UI设计需求,自定义各种样式的弹窗子视图: 自定义UI及样式 自定义...

  • iPhone X适配

    宏定义 不经意间发现了一个bug: Tabbar自定义与适配 tabbar上面是4个tab加一个自定义视图View...

  • 高级UI<第十一篇>:视图的摆放(onLayout)

    视图摆放,即自定义视图onLayout的实现,当自定义一个视图时,基本都会重写onMeasure、onLayout...

  • Swift gif动态启动页面

    创建一个自定义的视图LaunchImageView(UIImageView),在自定义视图中,加载gif图 随后在...

  • iOS-自定义视图

    自定义视图 自定义视图:系统标准UI之外,自己组合而出的新的视图。自定义视图的优点:iOS提供了很多UI组件,借助...

  • iOS7、8半透明弹出框及弹出后弹出前页面消失问题

    需求:做一个自定义视图弹框,弹出框之外的背景视图为半透明设计方案:使用模态视图弹出自定义视图产生问题:presen...

  • 为数据输入自定义视图 <- iOS文本编程指南

    UIKit允许app用自定义的输入视图替换系统键盘。它还允许app有一个附加视图在系统键盘或自定义输入视图之上。另...

  • 10-1.GLSL加载图片

    整体流程图 主要分为4个模块 准备工作:项目的创建及自定义视图、属性等 自定义着色器:利用GLSL编写自定义的顶点...

  • 自定义多状态View

    一个支持多种状态的自定义View,可以方便的切换到: 加载中视图 错误视图 空数据视图 网络异常视图 内容视图 G...

网友评论

      本文标题:自定义的视图及一个bug

      本文链接:https://www.haomeiwen.com/subject/nslnhqtx.html