了解到 APIView
以后, 你能够尝试看下 GenericAPIView
的源码, 导入路径是:python
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
复制代码
在源码中能够看到他是在 APIView
的一种拓展, 当你继承这个视图类撰写自定义视图的时候, 你能够获取如下几个属性:函数
queryset
:用于从该视图返回查询集对象, 必须设置此属性或重写 get_queryset()
方法, 若是要覆盖视图方法, 则必须进行调用 get_queryset()
而不是直接访问此属性serializer_class
:用于验证输入和反序列化输出的序列化类, 必须设置此属性或重写 get_serializer_class()
方法。lookup_field
:用于执行单个模型实例的对象查找的模型字段, 默认为 pk
lookup_url_kwarg
:用于对象查找的URL关键字参数#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAdminUser
from models import User
class MedusaSerializer(serializers.Serializer):
...
class MedusaView(GenericAPIView):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
固然, 可能在 APIView
上拓展了一些方法放咱们的 API 撰写变得简单, 而且富有规范性, 可是相比较而言, 他的存在更加推荐和 mixins
一块儿使用,post
perform_create(self, serializer)
- CreateModelMixin 保存新对象实例时调用perform_update(self, serializer)
- UpdateModelMixin 保存现有对象实例时调用perform_destroy(self, instance)
- DestroyModelMixin 删除对象实例时调用例如你在新建实例对象进行保存处理的时候还须要作其余的处理, 你就能够在 perform_create(self, serializer)
中对它进行重写:url
def perform_create(self, serializer):
instance = serializer.save()
# 你须要作的其余处理的函数, 或者代码块
...
复制代码
你也能够对更新的数据进行再次验证, 引起 ValidationError()
异常:spa
def perform_update(self, serializer):
if 1 == 1:
raise ValidationError('我无论,我就是不让你更新。')
serializer.save(user=self.request.user)
复制代码
固然啦, 还有 ListModelMixin
来获取数据集合的, RetrieveModelMixin
来获取某一数据详情的, 大多数的请求方式和请求内容都已经归纳了。rest
提供了 .list(request, *args, **kwargs)
方法, 用于查询对象集合, 你也能够重写他的 list
方法实现你本身的返回体, 你也能够对他进行数据分页(分页 将会在之后讲解到), 当你查询成功了, 将会返回 200 OK
的状态码给你:code
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, ListModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
提供 .create(request, *args, **kwargs)
方法, 该方法实现建立并保存模型的新实例对象, 若是成功建立对象则返回一个 201 Created
响应, 若是提供的用于建立对象的请求数据无效, 则会返回一个 400 Bad Request
响应, 并将错误详细信息做为响应的正文。orm
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, CreateModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
提供 .retrieve(request, *args, **kwargs)
方法, 该方法实如今响应中返回现有模型实例的详情数据, 若是能够检索到对象, 则返回一个 200 OK
响应, 不然将返回 404 Not Found
。cdn
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, RetrieveModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
提供 .update(request, *args, **kwargs)
方法, 该方法实现更新并保存现有模型的实例, 还提供了一种 .partial_update(request, *args, **kwargs)
方法, 该方法与该 update
方法相似, 可是用于更新的全部字段都是可选的, 这样能够支持 HTTP PATCH
请求(做者在实际开发中, 会对 UpdateModelsMixin
从新定义, 删除对 HTTP PATCH
请求方式的支持), 若是对象被更新, 它将返回一个 200 OK
响应, 若是提供的用于更新对象的请求数据无效, 则会返回 400 Bad Request
响应, 并将错误详细信息做为响应的主体。对象
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, UpdateModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
提供 .destroy(request, *args, **kwargs)
方法, 该方法实现删除现有模型实例, 若是删除对象成功则返回 204 No Content
响应, 不然将返回 404 Not Found
。
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import DestroyModelMixin
from rest_framework.permissions import IsAdminUser
class MedusaView(GenericAPIView, DestroyModelMixin):
queryset = User.objects.all()
serializer_class = MedusaSerializer
permission_classes = [IsAdminUser]
复制代码
CreateAPIView
POST
请求方式GenericAPIView
, CreateModelMixin
ListAPIView
GET
请求方式GenericAPIView
, ListModelMixin
RetrieveAPIView
GET
请求方式GenericAPIView
, RetrieveModelMixin
DestroyAPIView
DELETE
请求方式GenericAPIView
, DestroyModelMixin
UpdateAPIView
PUT
和 PATCH
请求方式GenericAPIView
, UpdateModelMixin
ListCreateAPIView
GET
和 POST
请求方式GenericAPIView
, ListModelMixin
, CreateModelMixin
RetrieveUpdateAPIView
GET
、 PUT
和 PATCH
请求方式GenericAPIView
, RetrieveModelMixin
, UpdateModelMixin
RetrieveDestroyAPIView
GET
和 DELETE
请求方式GenericAPIView
, RetrieveModelMixin
, DestroyModelMixin
RetrieveUpdateDestroyAPIView
GET
、PUT
、PATCH
和 DELETE
请求方式GenericAPIView
, RetrieveModelMixin
, UpdateModelMixin
, DestroyModelMixin