djangorestframework modelserializer 处理关系字段
0.技术体系
django4.2 + djangorestframework + vue3 + element-plus + uWSGI(部署) + 宝塔
1.关系
一对一、多对一、多对多
2.drf modelserializer对关系字段的处理
modelserializer默认处理关系字段为PrimaryKeyRelatedField,默认是id-pk。
多对一:直接写入id
多对多:写入id-list [id1, id2]
3.具体细节
[1] read_only设置serializer字段后,只能序列化;反序列化输入只保存在initial_data,不进入validated_data中
[2] modelserializer中底层可以处理validated_data中的多对多关系,但是read_only设置后,validated_data不包含多对多关系;因此再重写save,再单独处理多对多关系
[3] drf modelserialzier中处理多对多关系,首先处理非多对多关系,然后save,再处理多对多关系。如样例代码!
instance.set是底层自动调用django orm执行,写入多对多第三张表!对应的还有add、remove、clear。这个在Django官网QuerySet中有介绍!
4.痛悟
由于自己直接采用DRF,对于django的model了解的很少,本质是对queryset的很多函数不懂,导致不知道django orm很多操作。
因此,有不懂的操作,drf查不到的,大概率是在django官网能查到。另外这个wiki也可以学到不少!
DRF教程网上有本书:Django REST framework API 指南 (自行搜索即可)
着重看Django4.2官网,DRF官网和参考资料书,基本上满足;然后需要思考如何设计逻辑关系表,这是重要的!
5.其它
目前大多数需求,基于django同步即可满足,现在django4.2 orm有异步接口(底层操作数据库还是同步的!),view和middware都支持异步了,既然有了异步,那么肯定对性能有所提升,但是预计达不到fastapi的异步的水平!
对于10人以内团队,django+DRF+vue3+uWSGI满足需求了,不用刻意追求async异步,真要异步可以考虑fastapi。因此,目前我的实现都是同步实现的。满足
对于复杂逻辑关系的系统,推荐适用django(包含jwt、filter、drf、cors等库),若追求性能,可使用fastapi。网上有分析可参考。目前我的性能满足,需要关注逻辑关系和简单实现快速开发。