前言
mixins
翻译成中文是混入,组件的意思。在DRF
中,针对获取列表,检索,创建等操作,都有相应的mixin
,一般我们自定义创建的类视图都会继承自GenericAPIView
和Mixins
一起使用
mixins工具集
mixins.py
文件中有5个类,分别是
-
CreateModelMixin
:类中有个create
方法,相当于单增 -
ListModelMixin
:类中有个list
方法,相当于群查 -
RetrieveModelMixin
:类中有个`retrieve方法,相当于单查 -
UpdateModelMixin
:类中有个update
和partial_update
2个方法,相当于单整体改和单局部改 -
DestroyModelMixin
:类中有个destroy
方法,相当于单删
接下来我们自定义视图类,继承自这5个工具类和GenericAPIView
:
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class StudentsGenericView(mixins.ListModelMixin, mixins.CreateModelMixin,
mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
mixins.DestroyModelMixin, GenericAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 单查
def get(self, request, *args, **kwargs):
pk = kwargs.get("pk")
if pk:
response = self.retrieve(request, *args, **kwargs)
else:
response = self.list(request, *args, **kwargs)
return APIResponse(results=response.data)
# 单增
def post(self, request, *args, **kwargs):
response = self.create(request, *args, **kwargs)
return APIResponse(results=response.data)
# 单整体改
def put(self, request, *args, **kwargs):
response = self.update(request, *args, **kwargs)
return APIResponse(results=response.data)
# 单局部改
def patch(self, request, *args, **kwargs):
response = self.partial_update(request, *args, **kwargs)
return APIResponse(results=response.data)
# 单删
def delete(self, request, *args, **kwargs):
response = self.destroy(request, *args, **kwargs)
return APIResponse(results=response.data)
以上我们通过继承GenericAPIView
,可以设置queryset
以及serializer_class
,那么视图函数就知道你是要针对哪个模型做处理,你的序列化的类是什么了。接着我们继承mixins
的5个工具类,这样StudentList
就拥有了获取列表,以及创建数据的功能。
以下方法由mixin
类提供,并提供对象保存或删除行为的简单重写。
-
perform_create(self, serializer)
- 在保存新对象实例时由CreateModelMixin
调用。 -
perform_update(self, serializer)
- 在保存现有对象实例时由UpdateModelMixin
调用。 -
perform_destroy(self, instance)
- 在删除对象实例时由DestroyModelMixin
调用。
这些钩子对于设置请求中隐含的但不是请求数据的一部分的属性特别有用。例如,你可以根据请求用户或基于URL
关键字参数在对象上设置属性。
def perform_create(self, serializer):
serializer.save(user=self.request.user)
这些可重写的关键点对于添加在保存对象之前或之后发生的行为(例如通过电子邮件发送确认或记录更新日志)也特别有用。
def perform_update(self, serializer):
instance = serializer.save()
send_email_confirmation(user=self.request.user, modified=instance)
你还可以使用这些钩子通过抛出 ValidationError()
来提供额外的验证。当你需要在数据库保存时应用一些验证逻辑时,这会很有用。 例如:
def perform_create(self, serializer):
queryset = SignupRequest.objects.filter(user=self.request.user)
if queryset.exists():
raise ValidationError('You have already signed up')
serializer.save(user=self.request.user)