GitHub - JokerHai/haystack: Django 学习案例 · GitHub
Skip to content

Latest commit

 

History

18 Commits

Folders and files

Repository files navigation

django 初学者 案例

使用步骤:

    python -m venv venv

    . venv/bin/activate 进入虚拟环境

    pip install -r requirements.txt 导入jar 依赖包


    使用数据迁移命令创建数据库

        生成迁移文件

        python manage.py makemigrations

        同步到数据库中

        python manage.py migrate

    注意:
            数据库配置文件需要更改,请查看数据库配置的是否相同

DRF框架学习总结

APIView:View类的子类,在View类的基础上添加了一些功能。

​	1)request对象是由DRF框架封装成Request类的对象。

	​	request.data:解析之后的请求体的数据。request.body|request.POST|request.FILES

	​	request.query_params:解析之后的查询字符串的数据。

​	2)响应可以统一返回Response的对象。

​		Accept json html

​	3)异常。

​	4)高级功能:认证 权限 限流

GenericAPIView:APIView类的子类,在APIView类的基础上添加操作序列化器和数据库查询的相关方法。

操作序列化器:

​	属性:serializer_class:指定视图所使用的序列化器类

​	方法:

​		get_serializer_class:返回视图所使用的序列化器类

​		get_serializer:创建序列化器类的对象

数据库查询:

​	属性:queryset:指定视图所使用的查询集。

​	方法:

​		get_queryset:获取视图所使用的查询集。

​		get_object:从视图所使用的查询集中获取指定的对象,默认根据pk进行查询。
视图类
# 需求1:写一个类视图,提供以下1个接口
	1. 获取所有的图书数据 get /books/
    # 子类视图版本
    class BookListView(ListAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer

    # APIView版本
    class BookListView(APIView):
        def get(self, request):
            # 1. 获取所有的图书的数据
            books = BookInfo.objects.all()

            # 2. 将图书数据序列化并返回
            serializer = BookInfoSerializer(books, many=True)
           	return Response(serializer.data)

    # GenericAPIView版本
    class BookListView(GenericAPIView):
        serializer_class = BookInfoSerializer
        queryset = BookInfo.objects.all()

        def get(self, request):
            # 1. 获取所有的图书的数据
            books = self.get_queryset()

            # 2. 将图书数据序列化并返回
            serializer = self.get_serializer(books, many=True)
            return Response(serializer.data)

    # Mixin扩展类版本
    class BookListView(ListModelMixin,
                       GenericAPIView):
        serializer_class = BookInfoSerializer
        queryset = BookInfo.objects.all()

        def get(self, request):
            return self.list(request)


# 需求2:写一个类视图,提供以下2个接口
	1. 获取指定的图书数据 get /books/(?P<pk>\d+)/
    2. 修改指定的图书数据 put /books/(?P<pk>\d+)/
    #  子类视图版本
    class BookDetailView(RetrieveUpdateAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer

   	# APIView版本
	class BookDetailView(APIView):
        def get(self, request, pk):
            try:
                book = BookInfo.objects.get(pk=pk)
            except BookInfo.DoesNotExist:
                raise Http404

           	serializer = BookInfoSerializer(book)
            return Response(serializer.data)


        def put(self, request, pk):
            try:
                book = BookInfo.objects.get(pk=pk)
            except BookInfo.DoesNotExist:
                raise Http404

           	serializer = BookInfoSerializer(book, data=request.data)
            serializer.is_valid(raise_exception=True)

            serializer.save() # update

            return Response(serializer.data)

    # GenericAPIView版本
    class BookDetailView(GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer

        def get(self, request, pk):
            book = self.get_object()

           	serializer = self.get_serializer(book)
            return Response(serializer.data)


        def put(self, request, pk):
            book = self.get_object()

           	serializer = self.get_serializer(book, data=request.data)
            serializer.is_valid(raise_exception=True)

            serializer.save() # update

            return Response(serializer.data)

	# Mixin扩展类版本
   	class BookDetailView(RetrieveModelMixin,
                        UpdateModelMixin,
                        GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer

        def get(self, request, pk):
            return self.retrieve(request)


        def put(self, request, pk):
            return self.update(request)
视图集
# 需求1:写一个视图集,提供以下两种操作
	1. 获取一组图书信息(list) GET /books/
    2. 新建一本图书信息(create) POST /books/
    class BookInfoViewSet(ListModelMixin,
                          CreateModelMixin,
                          GenericViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer


# 需求2:写一个视图集,提供以下两种操作
	1. 获取一组图书信息(list) GET /books/
    2. 获取指定图书信息(retrieve) GET /books/(?P<pk>\d+)/
    class BookInfoViewSet(ReadOnlyModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer

# 需求3:写一个视图集,提供以下三种操作
	1. 获取一组图书信息(list) GET /books/
    2. 获取指定图书信息(retrieve) GET /books/(?P<pk>\d+)/
    3. 更新指定图书信息(update) PUT /books/(?P<pk>\d+)/
    class BookInfoViewSet(UpdateModelMixin, ReadOnlyModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
类视图

APIView:

​	1)request对象是Request类的对象

​		request.data:解析之后请求体的数据。request.body, request.POST, request.FILES

​		request.query_params: 解析之后的查询字符串数据。

​	2)统一返回Response对象

​	3)异常处理

​	4)高级功能:认证 权限 限流

GenericAPIView:APIView类子类

操作序列化器:

​	属性:serializer_class:指定当前视图所使用的序列化器类

​	方法:

​			get_serializer_class:返回当前视图所使用的序列化器类

​			get_serializer:创建一个视图所使用的序列化器类的对象

数据库查询:

​	属性:queryset:指定当前视图所使用的查询集

​	方法:

​		get_queryset:获取当前视图所使用的查询集

​		get_object:从查询集中查询指定的对象,默认根据pk进行查询

其他功能:过滤 分页

Mixin扩展类:5个

​	ListModelMixin: 提供了一个list方法,封装获取一组数据的通用流程

​	CreateModelMixin:提供了一个create方法,封装了新增一条数据的通用流程

​	RetrieveModelMixin:提供了一个retrieve方法,封装了获取指定数据的通用流程

​	UpdateModelMixin:提供了一个update方法,封装了更新指定数据的通用流程

​	DestroyModelMixin:提供了一个destroy方法(删除),封装了一个指定删除数据的指定流程

子类视图:9个

​	ListApiView

            继承了ListModelMixin和 Generic [dʒə'nɛrɪk]ApiView,同时提供了get方法

    CreateApiView
            继承自CreateModelMixin和 GenericApiView,同时提供了post方法

    Retrieve[rɪ'triv]ApiView
            继承自RetrieveModelMixin和GenericApiView,同时提供了get方法

    UpdateApiView
            继承自UpdateModelMixin和GenericApiView同时提供了put方法

    DestroyApiView
            继承DestroyApiModelMixin和GenericApiView同时提供了delete方法

    ListCreateApiView
            继承自ListModelMixin 和CreateModelMixin 和GenericApiView,同时提供了get,post 方法


    RetrieveUpdateApiView
            继承自RetrieveMixin UpdateMixin和GenericApiView,同时提供了get put patch 方法

    RetrieveDestroyApiView
            继承自RetrieveModelMixin DestroyModelMixin GenericApiView 同时提供了get delete方法

    RetrieveUpdateDestroyApiView
            继承自RetrieveModelMixin UpdateModelMixin DestroyModelMixin GenericApiView 同时提供了
                                 get put patch delete 方法
视图集

1)视图集基本使用

​	继承父类:ViewSet GenericViewSet ModelViewSet ReadOnlyModelViewSet

​	视图集中处理函数以对应操作命名:list create retrieve update destroy

​	进行url地址配置时需要指明请求方式和视图集中处理函数之间的对应关系

About

Django 学习案例

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages