# P09 Django APIView

## APIView

**APIView 的概念**

   APIview 是 Django REST Framework 提供的一个视图类。它和 Django 中的 view 类有些相似，但是又有一些不同之处。APIview 可以处理基于 HTTP 协议的请求，并返回基于内容协商的响应，它旨在提供一个易于使用且灵活的方式来构建 API 视图。


**view.py**

   ```python
   # 面向对象编程
   from django.shortcuts import render
   from rest_framework.decorators import api_view
   from .models import *
   from rest_framework.response import Response
   from rest_framework.views import APIView
   #### APIView
    class GetGoods(APIView):
        def get(self, request):
            data = Goods.objects.all()
            serializer = GoodsSerializer(instance=data, many=True)
            print(serializer.data)
            return Response(serializer.data)

        def post(self, request):
            # 从请求数据中提取字段
            request_data = {
                "category": request.data.get("Goodscategory"),
                "number": request.data.get("number"),
                "name": request.data.get("name"),
                "barcode": request.data.get("barcode"),
                "spec": request.data.get("spec"),
                "shelf_life_days": request.data.get("shelf_life_days"),
                "purchase_price": request.data.get("purchase_price"),
                "retail_price": request.data.get("retail_price"),
                "remark": request.data.get("remark"),
            }

            # 使用 create() 方法创建新的商品对象
            new_goods = Goods.objects.create(**request_data)

            # 对创建的对象进行序列化，并作为响应返回
            serializer = GoodsSerializer(instance=new_goods)
            return Response(serializer.data)


    # 面向对象编程
    class FilterGoodsCategoryAPI(APIView):
        # request 表示当前的请求对象
        # self 表示当前实例对象

        def get(self, request, format=None):
            print(request.method)
            return Response('ok')

        def post(self, request, format=None):
            print(request.method)
            return Response('ok')

        def put(self, request, format=None):
            print(request.method)
            return Response('ok')
   ```

   **url.py**

   ```python
   from apps.erp_test.views import *

   urlpatterns = [
       path('admin/', admin.site.urls),
       path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
       path('getgoods/', GetGoods.as_view()),
   ]
   ```

   首先，self 表示当前实例对象，这里指的是视图类的实例对象。

   request 表示当前的请求对象，包含了客户端发送的信息，例如请求头、请求体等。

   pk 是 path 参数 [int:pk](int:pk)，用于获取请求中的产品 ID。

   format 表示客户端请求的响应格式，例如 JSON、XML 等。这个参数通常不需要指定，会根据客户端发送的 Accept 请求头来自动选择响应格式。如果客户端指定了响应格式，那么我们可以从请求中获取到这个参数并且做出相应的处理。

   在这个方法中，我们需要通过 pk 参数获取到对应的产品数据，并将其序列化成 JSON 格式并返回给客户端。具体的实现方式可以参考序列化器文档和 Django ORM 文档。

　　‍
