drf models代码操作 请求与响应 视图组件

内容详细

1.1 models

        from django.db import models


        # 4张表
        class Book(models.Model):
            name = models.CharField(max_length=32)
            price = models.DecimalField(max_digits=5, decimal_places=2)
            publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
            authors = models.ManyToManyField(to='Author')

            def __str__(self):
                return self.name

            @property
            def publish_detail(self):
                return {'name': self.publish.name, 'addr': self.publish.city}

            @property
            def author_list(self):
                l = []
                print(self.authors.all())
                for author in self.authors.all():
                    print(author.author_detail)
                    l.append({'name': author.name,'age':author.age,'addr':author.author_detail.addr})
                return l


        class Author(models.Model):
            name = models.CharField(max_length=32)
            age = models.IntegerField()
            author_detail = models.OneToOneField(to='AuthorDatail', on_delete=models.CASCADE)
            # OneToOneField 就是ForeignKey+unique=True


        class AuthorDatail(models.Model):
            telephone = models.BigIntegerField()
            # birthday = models.DateField()
            addr = models.CharField(max_length=64)


        class Publish(models.Model):
            name = models.CharField(max_length=32)
            city = models.CharField(max_length=32)
            email = models.EmailField()

1.2 serializer

        from .models import *
        from rest_framework import serializers


        class BookSerializer(serializers.ModelSerializer):
            class Meta:
                model = Book
                fields = '__all__'


        class AuthorSerialzier(serializers.ModelSerializer):
            class Meta:
                model = Author
                fields = '__all__'


        from .models import *
        from rest_framework import serializers


        class BookSerializer(serializers.ModelSerializer):
            class Meta:
                model = Book
                fields = ['id', 'name', 'price', 'authors', 'publish', 'publish_detail', 'author_list']
                # depth=1  # 尽量不要用,关联表一层全部取出来
                extra_kwargs = {
                    'publish': {'write_only': True},
                    'authors': {'write_only': True},
                }

            # 定制序列化的字段(2种)--》表模型中


        class AuthorSerialzier(serializers.ModelSerializer):
            class Meta:
                model = Author
                fields = '__all__'


        class AuthorDetailSerialzier(serializers.ModelSerializer):
            class Meta:
                model = AuthorDatail
                fields = '__all__'


        class PublishSerialzier(serializers.ModelSerializer):
            class Meta:
                model = Publish
                fields = '__all__'


        class AuthorDetailSerialzier(serializers.ModelSerializer):
            class Meta:
                model = AuthorDatail
                fields = '__all__'


        class PublishSerialzier(serializers.ModelSerializer):
            class Meta:
                model = Publish
                fields = '__all__'

1.3 views


        class BookView(APIView):
            def get(self, request):
                book_list = Book.objects.all()
                ser = BookSerializer(instance=book_list, many=True)
                return Response(ser.data)

            def post(self, request):
                ser = BookSerializer(data=request.data)
                if ser.is_valid():
                    ser.save()
                    return Response({"code": 100, 'msg': '新增成功', 'data': ser.data})
                return Response({"code": 101, 'msg': '新增出错', 'err': ser.errors})


        class BookDetailView(APIView):
            def get(self, request, pk):
                book = Book.objects.all().filter(pk=pk).first()
                ser = BookSerializer(instance=book)
                return Response(ser.data)

            def put(self, request, pk):
                book = Book.objects.all().filter(pk=pk).first()
                ser = BookSerializer(instance=book, data=request.data)
                if ser.is_valid():
                    ser.save()
                    return Response({"code": 100, 'msg': '修改成功', 'data': ser.data})
                return Response({"code": 101, 'msg': '修改出错', 'err': ser.errors})

            def delete(self, request, pk):
                Book.objects.filter(pk=pk).delete()
                return Response({"code": 100, 'msg': '删除成功'})

1.4 urls

        urlpatterns = [
            path('admin/', admin.site.urls),
            path('books/', views.BookView.as_view()),
            path('books/<int:pk>', views.BookDetailView.as_view()),
        ]

2 请求与响应

2.1 请求

        # Request 类的对象---》新的request对象
        from rest_framework.request import Request
        # 记住的
            __getattr__
            request.data
          request.query_parmas--->self._request.GET-->restful规范里,请求地址中带过滤(查询)条件---》get请求地址中提交的
        数据在GET中,---》query_parmas:查询参数


        # 了解--->默认情况下,可以解析 urlencoded,formdata,json
            -如果我们写了一个接口,想只能处理json格式,或者只能处理formdata



        # 局部配置
        from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
        class PublishView(APIView):
            # 局部使用,只针对当前视图类有效,只想处理json格式
            parser_classes = [JSONParser]

        # 全局配置---》配置文件--->所有接口都只能解析json格式
        REST_FRAMEWORK = {
            'DEFAULT_PARSER_CLASSES': [
                'rest_framework.parsers.JSONParser',
            ],
        }

        # 全局配置解析json,局部某个视图函数想能解析formdata格式

        视图类中配置一下即可---》局部配置

        -如果局部配置如下,会怎么样
        parser_classes = [] # 所有格式都补不能解析了

        # 使用顺序:我们没有配置,也有默认配置:3个都能解析
            drf有默认配置(最后)----》项目配置文件的配置(其次)----》视图类中配的(优先用)
          drf的默认配置:from rest_framework import settings




         # 总结:一般情况下,都使用默认即可,不用配置

2.2 响应

        Respone:from rest_framework.response import Response

        # 属性
        data=None,    # 字符串,字典,列表--》给http响应body体中内容-->response对象中取出处理
        status=None,  # 响应状态码:1xx,2xx,3xx,默认是200
        from rest_framework.status import HTTP_201_CREATED
        Response(ser.data,status=HTTP_201_CREATED)

        headers=None,      # 响应头 字典

        ---了解---
        template_name=None,  # 模板名字(不用),用浏览器访问时,可以改
        exception=False,    # 异常处理
        content_type=None   # 响应编码格式



        # 响应格式---》跟解析格式

        # 局部设置
        from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
        class BookDetailView(APIView):
            renderer_classes = [JSONRenderer,]
        # 全局设置
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
                'rest_framework.renderers.JSONRenderer',  # json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
            )
        }


3 视图组件

        # APIView  
            from rest_framework.views import APIView
          -类属性
            -renderer_classes,parser_classes。。。
          -get方法,post方法,delete方法写法跟之前的View一样,只不过request对象变成了新的request丢下
          -比之前的View多了三大认证和全局异常处理


        # GenericAPIView  继承了APIView  ,多了属性和方法
            from rest_framework.generics import GenericAPIView
          -属性(先记两个)
            -queryset = None
            -serializer_class = None
          -方法
            -get_queryset
            -get_object
            -get_serializer



        # 5个视图扩展类(不是视图类,没有集成APIView,需要配合GenericAPIView)
          from rest_framework.mixins
          CreateModelMixin,
          ListModelMixin,
          DestroyModelMixin,
          RetrieveModelMixin,
          UpdateModelMixin



        # 9个视图子类 
          from rest_framework.generics 
          CreateAPIView,
          ListAPIView,
          DestroyAPIView,
          RetrieveAPIView,
          UpdateAPIView
          ListCreateAPIView,
          RetrieveUpdateAPIView,
          RetrieveUpdateDestroyAPIView,
          RetrieveDestroyAPIView

        # 视图集
            from rest_framework.viewsets 
          # 两个视图类
          ModelViewSet,ReadOnlyModelViewSet
          # 视图类
          ViewSet,GenericViewSet,
          # 魔法类
          ViewSetMixin

posted @ 2022-05-22 22:06  风花雪月*  阅读(56)  评论(0编辑  收藏  举报