• django rest framework快速使用


    一、安装相关的依赖
    $ pip install djangorestframework
    $ pip install markdown       # Markdown support for the browsable API.
    $ pip install django-filter  # Filtering support
    
    • 1
    • 2
    • 3
    二、将rest_framework添加到INSTALLED_APPS中

    setting.py

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    
    • 1
    • 2
    • 3
    • 4
    三、基础例子
    1. 创建一个django项目并创建book app

      $ python djang-admin createproject myapp
      $ python manage.py startapp book
      
      • 1
      • 2
    2. 新建model

      book/models.py

      from django.db import models
      class Book(models.Model):
          title = models.CharField(max_length=32, verbose_name='书籍名称')
          price = models.IntegerField(verbose_name="价格")
          pub_date = models.DateField(verbose_name="出版日期")
      
      • 1
      • 2
      • 3
      • 4
      • 5
    3. 创建Book序列化器和Book view

      book/views.py

      # 序列化器
      class BookViewSerializer(serializers.Serializer):
          title = serializers.CharField(max_length=32)
          price = serializers.IntegerField()
           # 自定义映射参数中的字段和model字段
          date = serializers.DateField(source='pub_date')
      
          def create(self, validated_data):
              saved_book = Book.objects.create(**validated_data)
              return saved_book
      
          def update(self, instance, validated_data):
              Book.objects.filter(pk=instance.pk).update(**validated_data)
              return Book.objects.get(pk=instance.pk)
      
      # 视图
      class BookView(APIView):
      
          def get(self, request):
              book_list = Book.objects.all()
              b = BookViewSerializer(instance=book_list, many=True)
              return Response(b.data)
      
          def post(self, request):
              data = request.data
              # 反序列化
              sers = BookViewSerializer(data=data)
              # 校验字段
              if sers.is_valid():
                  valid_data = sers.validated_data
                  sers.save()
                  # print(saved_book)
                  return Response(sers.data)
              else:
                  return Response(sers.errors)
      
      # 视图
      class BookDetailView(APIView):
          def get(self, request, id):
              book = Book.objects.get(pk=id)
              res = BookViewSerializer(instance=book)
              return Response(res.data)
      
          def put(self, request, id):
              data = request.data
              query_data = Book.objects.get(pk=id)
              sers = BookViewSerializer(instance=query_data, data=data)
              if sers.is_valid():
                  print(sers.validated_data)
                  sers.save()
                  return Response()
              else:
                  return Response(sers.errors)
      
          def delete(self, request, id):
              Book.objects.filter(pk=id).delete()
              return Response()
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
    4. 配置路由

      book/urls.py

      from django.urls import path, re_path
      
      from . import views
      urlpatterns = [
          path('book/', views.BookView.as_view()),
          re_path('book/(\d+)', views.BookDetailView.as_view()),
      ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    5. 将应用路由添加到项目路由中

      myapp/urls.py

      urlpatterns = [
          ...
          path('book/', include('book.urls'))
      ]
      
      • 1
      • 2
      • 3
      • 4
    6. 安装app

      myapp/settings.py

      INSTALLED_APPS = [
          ...
          'rest_framework',
        	'book',
      ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
    7. 访问路由

      列表:curl http://server/book/book/ get
      详情:curl http://server/book/book/1 get
      添加:curl http://server/book/book/ post
      更新:curl http://server/book/book/1 put
      删除:curl http://server/book/book/1 delete
      
      • 1
      • 2
      • 3
      • 4
      • 5
    四、Django rest framework高度封装例子

    在步骤三中的项目为基础,model无变化

    1. Views.py修改

      book/views.py

      from rest_framework.viewsets import ModelViewSet
      from rest_framework import serializers
      # 序列化器
      class BookViewSerializer(serializers.ModelSerializer):
          date = serializers.CharField(source='pub_date') # 自定义映射参数中的字段和model字段
          class Meta:
              model = Book
              exclude = ['pub_date']
      # 视图        
      class BookView(ModelViewSet):
          queryset = Author.objects.all()
          serializer_class = AuthorSerializer
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    2. urls.py修改

      from rest_framework import routers
      router = routers.DefaultRouter()
      
      router.register('book', views.BookView)
      
      urlpatterns = [
          ...
      ]
      urlpatterns += router.urls
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      router.register(‘book’, views.BookView)将会生成和步骤三.4一样的路由

      path('book/', views.BookView.as_view()),
      re_path('book/(\d+)', views.BookDetailView.as_view()),
      
      • 1
      • 2

      后面的访问和步骤三一致。

  • 相关阅读:
    代码随想录二刷 Day42
    【linux】VirtualBox启动虚拟机报错
    LabVIEW程序框图进行缩放
    Java Package用法:组织与管理类的利器
    如何降低云计算成本?
    【八股总结】至今为止遇到的八股(下半)
    独立站新手卖家应注意的要点
    双十二有哪些实用性强的数码好物?值得入手的实用数码好物推荐
    AI:129-基于深度学习的极端天气事件预警
    动态dp
  • 原文地址:https://blog.csdn.net/fggdgh/article/details/126443483