# 04.基于GenericAPIView类的视图
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 创建路由
```python
### shop.urls
# 基于GenericAPIView类的视图
path('category/list/generic/apiview/', CategoryListGenericAPIView.as_view(), name='categoryListGenericAPIView'),
# 此处的参数,必须命名为pk
re_path(r'^category/detail/generic/apiview/(?P<pk>\d+)/$', CategoryDetailGenericAPIView.as_view(), name='categoryDetailGenericAPIView'),
```
<br><br>
### 创建视图
#### 导入模块
```python
### shop.views
from rest_framework import generics
from rest_framework import mixins
```
#### 多个对象
混合类的使用
GenericAPIView继承了APIView
*Mixin扩展了原有类的功能,但是不继承原有类
generics.ListCreateAPIView
此类有以下三个类的功能 并重写了get与post方法
只需要指定:queryset与serializer_class即可
```python
### shop.views
class CategoryListGenericView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
# 重写该方法 返回对象
def get_queryset(self):
return Category.objects.all()
# 重写该方法 返回序列化类
def get_serializer_class(self):
return CategorySerializer
queryset = Category.objects.all()
serializer_class = CategorySerializer
# ListModelMixin
def get(self, request):
return self.list(request)
# CreateModelMixin
def post(self, request):
return self.create(request)
```
#### 单个对象
generics.RetrieveUpdateDestroyAPIView
与ListCreateAPIView原理相同
只需要写入如下内容即可
queryset = Category.objects.all()
serializer_class = CategorySerializer
```python
### shop.views
class CategoryDetailGenericView(generics.GenericAPIView,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
):
queryset = Category.objects.all()
serializer_class = CategorySerializer
# RetrieveModelMixin
# 此处的参数,必须命名为pk
def get(self, request, pk):
return self.retrieve(request, pk=pk)
# UpdateModelMixin
def put(self, request, pk):
return self.update(request, pk=pk)
# UpdateModelMixin
def patch(self, request, pk):
return self.update(request, pk=pk)
# DestroyModelMixin
def delete(self, request, pk):
return self.delete(request, pk=pk)
```
![drf](imgs/03.png)
<br><br>