基于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()
,
这样就会再次去数据库里面查一次,也就是更新了数据
网友评论