Django REST framework 嵌套关系的数据保存(Writable nested serializers)
来源:互联网 发布:qq飞车锐速数据官方 编辑:程序博客网 时间:2024/05/21 15:40
利用Django REST framework 能很方便的对Django的model嵌套关系进行展示。嵌套关系的展示通过在序列化类中的depth属性来设置,depth表示嵌套关系展开的层数。比如,Djiango自带的User 模型。User关联了Groups ,同时,Groups又关联了Permission。序列化类定义如下:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' depth = 2
得到的json数据将进行2层的嵌套关系的展开,结果如下:
{ "id": 1, "username": "admin", ... ... "groups": [ { "id": 1, "name": "test111", "permissions": [ { "id": 28, "name": "Can add 联系人信息", "codename": "add_customercontact", "content_type": 10 }, { "id": 61, "name": "Can add market info", "codename": "add_marketinfo", "content_type": 21 }, { "id": 62, "name": "Can change market info", "codename": "change_marketinfo", "content_type": 21 } ] } ], "user_permissions": [ { "id": 1, "name": "Can add log entry", "codename": "add_logentry", "content_type": { "id": 1, "app_label": "admin", "model": "logentry" } } ... ... ]}
虽然这种模式很方便的对数据进行了嵌套展示,但是也带来了一个问题,无法对数据进行保存和更新。
在文档中说明了:
To use writable nested serialization you'll want to declare a nested field on the serializer class, and write the create()
and/or update()
methods explicitly.
文档中提供的方法,但是感觉不好用。于是,采用了下面这种方式。创建两个序列化类,一个有depth,一个没有depth,如下:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' depth = 2 class UserSerializerNodepth(serializers.ModelSerializer): class Meta: model = User fields = '__all__'
然后在ViewSet中,重载create方法,如下:
1 def create(self, request): 2 serialized = UserSerializerNoDepth(data=request.data) 3 if serialized.is_valid(): 4 serialized.save() 5 return Response(serialized.data) 6 else: 7 return Response(serialized.errors)
关键点在第2行,即利用UserSerializerNoDepth对数据进行序列化,而不是用ViewSet原来指定的UserSerializer进行序列化。这样就能在统一的路由下查看展开的嵌套数据,又能进行数据的保存了。update也是同样的方式:
1 def update(self, request,pk=None): 2 user= self.get_object() 3 serialized = UserSerializerNoDepth(user,data=request.data) 4 if serialized.is_valid(): 5 serialized.save() 6 return Response(serialized.data) 7 else: 8 return Response(serialized.errors,status=status.HTTP_400_BAD_REQUEST)
0 0
- Django REST framework 嵌套关系的数据保存(Writable nested serializers)
- Django rest framework ---Serializers
- django rest framework 视图类的关系
- Django-REST之1:serializers序列器-翻译及自己的学习笔记(更新完善中...)
- django rest framework - 数据解析
- Django Rest Framework(一)
- django rest framework关联关系——Serializer relations
- Django REST FrameWork中文教程5:关系和超链接API
- 如何优化 Django REST Framework 的性能?
- Django REST framework 的快速入门教程
- Django-rest-framework中过滤器的定制
- python django rest framework Serialization 的学习
- django-rest-framework过滤器的使用(三)
- Django-rest-framework学习(-)Serialization
- Django REST framework
- Django REST framework API
- Django REST framework
- Django-Rest-Framework 教程
- Java:包装类(转)
- 前端开源项目周报0221
- 侧滑栏DrawerLayout的简单使用
- Tomcat7配置数据源
- 【HDU 2007】平方和与立方和(坑)
- Django REST framework 嵌套关系的数据保存(Writable nested serializers)
- iOS 点击推送进入应用处理逻辑
- Linux:sudo,没有找到有效的 sudoers 资源。
- RDBMS对比NoSQL
- ThreadPoolExecutor使用错误导致死锁
- 基于Node.js的模板引擎大比拼
- MySql中游标的定义与三种使用方式(2)
- java里面执行Run as----->Java Application的时候报错:javax.naming.NoInitialContextException
- 欢迎使用CSDN-markdown编辑器