继承APIView 完成视图功能
步骤很简单,
1.数据库读取数据,
2.查询结果序列化,
3.返回给前端
class SnippetList(APIView):
"""
List all snippets, or create a new snippet.
"""
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
继承(GenericAPIView ,mixIns中的类)来简化代码
GenericAPIView继承APIView,提供了queryset
,serializer_class
get_queryset
属性等。
mixIns是一个py文件。有四个类CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin。以获取列表页数据为例,使用ListModelMixin类。实际上,这些mixin独立使用几乎毫无意义,他们调用的是GenericAPIView中定义的方法和属性。
这两个类配合使用也很简单
1.重写GenericAPIView的属性,指定querySet和serializer_class类
2.调用mixIns类的方法
class SnippetList(mixins.ListModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all() ---------- GenericAPIView的属性
serializer_class = SnippetSerializer ----------- GenericAPIView的属性
def get(self, request, *args, **kwargs): ---------Django视图类都要重写这个(set/get)方法,
return self.list(request, *args, **kwargs) -------- ListModelMixin的方法
self.list会返回django rest 的Response给前端的。而queryset
,serializer_class
的值会间接被ListModelMixin的list方法读取。
直接用多继承GenericAPIView和mixIns的类来简化代码
我们固然可以使用上面自己继承两个类的方法来实现我们的需求,实际上rest 自己也预留类一些合适的组合,并且组合中写好了get或者post方法对应调用的mixin的处理方法。这种类叫做
mixed-in generic views

class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
最终我们的类可以这样写.
class GoodsListView(generics.ListAPIView):
"""
商品列表页
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
总结
GenericAPIView和mixIns总是配合使用。业务要做的事情很简单,多继承他们,1是给GenericAPIView 一些关键属性赋值,2是调用mixIns的对应方法。
网友评论