• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Django REST framework Mixins

Python框架 彭东稳 6年前 (2018-09-27) 24465次浏览 已收录 0个评论

mixins在drf中主要配合viewset共同使用,实现http方法与mixins的相关类与方法进行关联。关于viewset可以看我另外一篇博客,这里不过多介绍。

在这个viewset中,主要有5类Minxin,他们与http方法对应如下:

mixins 作用 对应HTTP的请求方法
mixins.ListModelMixin 定义list方法,返回一个queryset的列表 GET
mixins.CreateModelMixin 定义create方法,创建一个实例 POST
mixins.RetrieveModelMixin 定义retrieve方法,返回一个具体的实例 GET
mixins.UpdateModelMixin 定义update方法,对某个实例进行更新 PUT/PATCH
mixins.DestroyModelMixin 定义delete方法,删除某个实例 DELETE

下面,我们将逐个Mixins介绍!

1. CreateModelMixin

其中,perform_create( )对serializer直接进行save保存,当在一些情境下,我们需要对perform_create( )进行重写。那么我们现在可能有一个下面的需要:假设现在有一个course课程model,里面维持了一个数,记录课程收藏数,还存在一个用户收藏userfav的model(应当有一个外键指向course),当一个用户对课程进行收藏,理论上现在post进来的应该是userfav的instance,显然,我们还需要对相应course的收藏数进行+1。

这个时候,我们就需要重写perform_create( )方法!

显然,这不是唯一的解决方法,我们还可以在seriliazer进行设置,我们还可以使用drf的信号量进行解决!

2. ListModelMixin

ListModelMixin一般用来获取列表页,大多数情况下比较简单,不需要重写相关的方法。

3. RetrieveModelMixin

注意,在viewset中设置lookup_field获取重写get_object()方法可以指定id具体对象是什么,默认 lookup_field = ‘pk’,在GenericAPIView视图类。对retrieve这个方法的重写几率比较高,例如我们在增加点击数的时候,经常要对其进行一个重写。

4. UpdateModelMixin

UpdateModelMixin的实现逻辑基本整合了Create以及Retrieve,先得到具体的实例,再对其进行验证以及保存,如果需要对更新这个逻辑进行自定义,那么需要重写perform_update()方法,而尽量少去重写update()。

5. DestroyModelMixin

DestroyModelMixin的逻辑也相对比较简单,我们以CreateModelMixin的例子为例,当我们取消收藏,那么我们的DestroyModelMixin就发挥作用了。

mixins相对比较好理解,本篇只是简要的分析了源码的内容以及各个mixins的逻辑,最重要的还是学会去重写它们相关的方法。

一般情况下,当我们在操作某一个model的时候,涉及到另外一个model中数据的修改,那么就需要对这个mixins下执行save的逻辑的方法进行重写。

<转载>

https://juejin.im/post/5a66fc64f265da3e4e25c6e7


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!