有什么岁月静好,不过是有人替你负重前行!哪

restful_framework之视图组件

一、基本视图

写一个出版社的增删查改resful接口

要自己事先创建好django项目,并创建好表,添加完记录

路由:

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

视图:

复制代码

from api import models
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'

class PublishView(APIView):
  #查询出版社表中所有记录
    def get(self, request):
        publish_list = models.Publish.objects.all()
        bs = PublishSerializers(publish_list, many=True)
        # 序列化数据

        return Response(bs.data)   #返回的结果是列表中套字典
  
    def post(self, request):
        # 添加一条数据
        print(request.data)

        bs=PublishSerializers(data=request.data)
        if bs.is_valid():
            bs.save()  # 生成记录
            return Response(bs.data)   #返回的是添加成功记录的字典
        else:

            return Response(bs.errors)

class PublishDetailView(APIView):
   #查询某一条数据
def get(self,request,pk): publish_obj=models.Publish.objects.filter(pk=pk).first() bs=PublishSerializers(publish_obj,many=False) return Response(bs.data)
   #更新某一条数据
def put(self,request,pk): publish_obj = models.Publish.objects.filter(pk=pk).first() bs=PublishSerializers(data=request.data,instance=publish_obj) if bs.is_valid(): bs.save() # update return Response(bs.data) else: return Response(bs.errors)
   #删除某一条数据
def delete(self,request,pk): models.Publish.objects.filter(pk=pk).delete() return Response("")
复制代码

二、mixins类和generic类编写视图

路由:

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

视图:

复制代码
from api import models
from rest_framework import serializers
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class PublishSer(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'
class Publish(GenericAPIView,mixins.ListModelMixin,mixins.CreateModelMixin):
    queryset = models.Publish.objects.all()
    serializer_class = PublishSer
    def get(self,request):
        return self.list(request)   #在ListModelMixin下有一个list方法,返回的就是查询的结果:Response(serializer.data)
    def post(self,request):
        return  self.create(request)  #已经封装好了,帮我们做校验和序列化,返回的是添加成功的记录

class PublishDetail(GenericAPIView,mixins.DestroyModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin):

    queryset = models.Publish.objects.all()
    serializer_class = PublishSer
    def get(self,request,*args, **kwargs):
        return self.retrieve(request,*args, **kwargs)

    def put(self,request,*args, **kwargs):
        return self.update(request,*args, **kwargs)

    def delete(self,request,*args, **kwargs):
        return self.destroy(request,*args, **kwargs)
复制代码

三、使用generic下ListCreateAPIView和RetrieveUpdateDestroyAPIView

路由:

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

视图:

复制代码
from api import models
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
from rest_framework import serializers
class Publishser(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'

class Publish(ListCreateAPIView):
    queryset = models.Publish.objects.all()
    serializer_class = Publishser

class PublishDetail(RetrieveUpdateDestroyAPIView):
    queryset = models.Publish.objects.all()
    serializer_class = Publishser
复制代码

四、使用ModelViewSet

路由:

url(r'^publish$',views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

视图:

复制代码
from rest_framework.viewsets import ModelViewSet
from api import models
from rest_framework import serializers
class Publishser(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'
class Publish(ModelViewSet):
    queryset = models.Publish.objects.all()
    serializer_class = Publishser
复制代码

 

posted @   迎风而来  阅读(220)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
/*吸附球*/
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多