{"id":5886,"date":"2022-04-03T13:14:33","date_gmt":"2022-04-03T05:14:33","guid":{"rendered":"https:\/\/egonlin.com\/?p=5886"},"modified":"2022-04-03T13:14:33","modified_gmt":"2022-04-03T05:14:33","slug":"04-02-%e4%ba%94%e4%b8%aa%e8%a7%86%e5%9b%be%e6%89%a9%e5%b1%95%e7%b1%bb","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=5886","title":{"rendered":"04-02 \u4e94\u4e2a\u89c6\u56fe\u6269\u5c55\u7c7b"},"content":{"rendered":"<h1>\u4e94\u4e2a\u89c6\u56fe\u6269\u5c55\u7c7b<\/h1>\n<p>\u4f5c\u7528\uff1a<\/p>\n<p>\u63d0\u4f9b\u4e86\u51e0\u79cd\u540e\u7aef\u89c6\u56fe\uff08\u5bf9\u6570\u636e\u8d44\u6e90\u8fdb\u884c\u66fe\u5220\u6539\u67e5\uff09\u5904\u7406\u6d41\u7a0b\u7684\u5b9e\u73b0\uff0c\u5982\u679c\u9700\u8981\u7f16\u5199\u7684\u89c6\u56fe\u5c5e\u4e8e\u8fd9\u4e94\u79cd\uff0c\u5219\u89c6\u56fe\u53ef\u4ee5\u901a\u8fc7\u7ee7\u627f\u76f8\u5e94\u7684\u6269\u5c55\u7c7b\u6765\u590d\u7528\u4ee3\u7801\uff0c\u51cf\u5c11\u81ea\u5df1\u7f16\u5199\u7684\u4ee3\u7801\u91cf\u3002<\/p>\n<p>\u8fd9\u4e94\u4e2a\u6269\u5c55\u7c7b\u9700\u8981\u642d\u914dGenericAPIView\u7236\u7c7b\uff0c\u56e0\u4e3a\u4e94\u4e2a\u6269\u5c55\u7c7b\u7684\u5b9e\u73b0\u9700\u8981\u8c03\u7528GenericAPIView\u63d0\u4f9b\u7684\u5e8f\u5217\u5316\u5668\u4e0e\u6570\u636e\u5e93\u67e5\u8be2\u7684\u65b9\u6cd5\u3002<\/p>\n<h4>1\uff09ListModelMixin<\/h4>\n<p>\u5217\u8868\u89c6\u56fe\u6269\u5c55\u7c7b\uff0c\u63d0\u4f9b<code>list(request, *args, **kwargs)<\/code>\u65b9\u6cd5\u5feb\u901f\u5b9e\u73b0\u5217\u8868\u89c6\u56fe\uff0c\u8fd4\u56de200\u72b6\u6001\u7801\u3002<\/p>\n<p>\u8be5Mixin\u7684list\u65b9\u6cd5\u4f1a\u5bf9\u6570\u636e\u8fdb\u884c\u8fc7\u6ee4\u548c\u5206\u9875\u3002<\/p>\n<p>\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-python\">class ListModelMixin(object):\n    &quot;&quot;&quot;\n    List a queryset.\n    &quot;&quot;&quot;\n    def list(self, request, *args, **kwargs):\n        # \u8fc7\u6ee4\n        queryset = self.filter_queryset(self.get_queryset())\n        # \u5206\u9875\n        page = self.paginate_queryset(queryset)\n        if page is not None:\n            serializer = self.get_serializer(page, many=True)\n            return self.get_paginated_response(serializer.data)\n        # \u5e8f\u5217\u5316\n        serializer = self.get_serializer(queryset, many=True)\n        return Response(serializer.data)<\/code><\/pre>\n<p>\u4e3e\u4f8b\uff1a<\/p>\n<pre><code class=\"language-python\">from rest_framework.mixins import ListModelMixin\n\nclass BookListView(ListModelMixin, GenericAPIView):\n    queryset = BookInfo.objects.all()\n    serializer_class = BookInfoSerializer\n\n    def get(self, request):\n        return self.list(request)<\/code><\/pre>\n<h4>2\uff09CreateModelMixin<\/h4>\n<p>\u521b\u5efa\u89c6\u56fe\u6269\u5c55\u7c7b\uff0c\u63d0\u4f9b<code>create(request, *args, **kwargs)<\/code>\u65b9\u6cd5\u5feb\u901f\u5b9e\u73b0\u521b\u5efa\u8d44\u6e90\u7684\u89c6\u56fe\uff0c\u6210\u529f\u8fd4\u56de201\u72b6\u6001\u7801\u3002<\/p>\n<p>\u5982\u679c\u5e8f\u5217\u5316\u5668\u5bf9\u524d\u7aef\u53d1\u9001\u7684\u6570\u636e\u9a8c\u8bc1\u5931\u8d25\uff0c\u8fd4\u56de400\u9519\u8bef\u3002<\/p>\n<p>\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-python\">class CreateModelMixin(object):\n    &quot;&quot;&quot;\n    Create a model instance.\n    &quot;&quot;&quot;\n    def create(self, request, *args, **kwargs):\n        # \u83b7\u53d6\u5e8f\u5217\u5316\u5668\n        serializer = self.get_serializer(data=request.data)\n        # \u9a8c\u8bc1\n        serializer.is_valid(raise_exception=True)\n        # \u4fdd\u5b58\n        self.perform_create(serializer)\n        headers = self.get_success_headers(serializer.data)\n        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)\n\n    def perform_create(self, serializer):\n        serializer.save()\n\n    def get_success_headers(self, data):\n        try:\n            return {&#039;Location&#039;: str(data[api_settings.URL_FIELD_NAME])}\n        except (TypeError, KeyError):\n            return {}<\/code><\/pre>\n<h4>3\uff09 RetrieveModelMixin<\/h4>\n<p>\u8be6\u60c5\u89c6\u56fe\u6269\u5c55\u7c7b\uff0c\u63d0\u4f9b<code>retrieve(request, *args, **kwargs)<\/code>\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5feb\u901f\u5b9e\u73b0\u8fd4\u56de\u4e00\u4e2a\u5b58\u5728\u7684\u6570\u636e\u5bf9\u8c61\u3002<\/p>\n<p>\u5982\u679c\u5b58\u5728\uff0c\u8fd4\u56de200\uff0c \u5426\u5219\u8fd4\u56de404\u3002<\/p>\n<p>\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-python\">class RetrieveModelMixin(object):\n    &quot;&quot;&quot;\n    Retrieve a model instance.\n    &quot;&quot;&quot;\n    def retrieve(self, request, *args, **kwargs):\n        # \u83b7\u53d6\u5bf9\u8c61\uff0c\u4f1a\u68c0\u67e5\u5bf9\u8c61\u7684\u6743\u9650\n        instance = self.get_object()\n        # \u5e8f\u5217\u5316\n        serializer = self.get_serializer(instance)\n        return Response(serializer.data)<\/code><\/pre>\n<p>\u4e3e\u4f8b\uff1a<\/p>\n<pre><code class=\"language-python\">class BookDetailView(RetrieveModelMixin, GenericAPIView):\n    queryset = BookInfo.objects.all()\n    serializer_class = BookInfoSerializer\n\n    def get(self, request, pk):\n        return self.retrieve(request)<\/code><\/pre>\n<h4>4\uff09UpdateModelMixin<\/h4>\n<p>\u66f4\u65b0\u89c6\u56fe\u6269\u5c55\u7c7b\uff0c\u63d0\u4f9b<code>update(request, *args, **kwargs)<\/code>\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5feb\u901f\u5b9e\u73b0\u66f4\u65b0\u4e00\u4e2a\u5b58\u5728\u7684\u6570\u636e\u5bf9\u8c61\u3002<\/p>\n<p>\u540c\u65f6\u4e5f\u63d0\u4f9b<code>partial_update(request, *args, **kwargs)<\/code>\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u5c40\u90e8\u66f4\u65b0\u3002<\/p>\n<p>\u6210\u529f\u8fd4\u56de200\uff0c\u5e8f\u5217\u5316\u5668\u6821\u9a8c\u6570\u636e\u5931\u8d25\u65f6\uff0c\u8fd4\u56de400\u9519\u8bef\u3002<\/p>\n<p>\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-python\">class UpdateModelMixin(object):\n    &quot;&quot;&quot;\n    Update a model instance.\n    &quot;&quot;&quot;\n    def update(self, request, *args, **kwargs):\n        partial = kwargs.pop(&#039;partial&#039;, False)\n        instance = self.get_object()\n        serializer = self.get_serializer(instance, data=request.data, partial=partial)\n        serializer.is_valid(raise_exception=True)\n        self.perform_update(serializer)\n\n        if getattr(instance, &#039;_prefetched_objects_cache&#039;, None):\n            # If &#039;prefetch_related&#039; has been applied to a queryset, we need to\n            # forcibly invalidate the prefetch cache on the instance.\n            instance._prefetched_objects_cache = {}\n\n        return Response(serializer.data)\n\n    def perform_update(self, serializer):\n        serializer.save()\n\n    def partial_update(self, request, *args, **kwargs):\n        kwargs[&#039;partial&#039;] = True\n        return self.update(request, *args, **kwargs)<\/code><\/pre>\n<h4>5\uff09DestroyModelMixin<\/h4>\n<p>\u5220\u9664\u89c6\u56fe\u6269\u5c55\u7c7b\uff0c\u63d0\u4f9b<code>destroy(request, *args, **kwargs)<\/code>\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5feb\u901f\u5b9e\u73b0\u5220\u9664\u4e00\u4e2a\u5b58\u5728\u7684\u6570\u636e\u5bf9\u8c61\u3002<\/p>\n<p>\u6210\u529f\u8fd4\u56de204\uff0c\u4e0d\u5b58\u5728\u8fd4\u56de404\u3002<\/p>\n<p>\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-python\">class DestroyModelMixin(object):\n    &quot;&quot;&quot;\n    Destroy a model instance.\n    &quot;&quot;&quot;\n    def destroy(self, request, *args, **kwargs):\n        instance = self.get_object()\n        self.perform_destroy(instance)\n        return Response(status=status.HTTP_204_NO_CONTENT)\n\n    def perform_destroy(self, instance):\n        instance.delete()<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e94\u4e2a\u89c6\u56fe\u6269\u5c55\u7c7b \u4f5c\u7528\uff1a \u63d0\u4f9b\u4e86\u51e0\u79cd\u540e\u7aef\u89c6\u56fe\uff08\u5bf9\u6570\u636e\u8d44\u6e90\u8fdb\u884c\u66fe\u5220\u6539\u67e5\uff09\u5904\u7406\u6d41\u7a0b\u7684\u5b9e\u73b0\uff0c\u5982\u679c\u9700\u8981\u7f16\u5199\u7684\u89c6\u56fe\u5c5e\u4e8e\u8fd9\u4e94 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[394,398],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5886"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5886"}],"version-history":[{"count":0,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5886\/revisions"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}