Django REST framework的各种技巧——2.serializer
2016-02-01 19:18
726 查看
serializer只做一件事情,json化model对象,所以这一部分相当简单
Django REST framework的各种技巧【目录索引】
首先是官方文档
首先一个关联的model
User对应的serializer
一个请求的response
外键直接可以引用其他的serializer,例如group,可以看到response中group是嵌套的
外键的属性可以使用source,例如phone
不在原来model上的东西使用SerializerMethodField(或者在model上但是你要对这个值做一些特殊处理)
如果说跟前端对的修改和查询使用不同的serializer,那么你就写两个,不希望修改的字段加上readonly(或者放在readonly_fields里面)
serializer的逻辑很简单,想到复杂的东西再说。Done
Django REST framework的各种技巧【目录索引】
写在最上面
所有的代码都是在下面的两个版本来做的django==1.8.8 djangorestframework==3.2.5
首先是官方文档
讲解
拿基本的user,group为例子首先一个关联的model
class UserProfile(TimeStampedModel): user = models.OneToOneField(User, unique=True, db_index=True, related_name='profile') name = models.CharField(blank=True, max_length=255, db_index=True) phone = models.CharField(default='', blank=True, max_length=64) nickname = models.CharField(blank=True, null=True, max_length=255, db_index=True) avatar = models.URLField(blank=True, max_length=255, default='') is_cms_user = models.BooleanField(default=False, db_index=True) is_cms_active = models.BooleanField(default=False, db_index=True) class Meta: # pylint: disable=missing-docstring db_table = "auth_userprofile" def __unicode__(self): return self.name
User对应的serializer
class GroupSerializer(serializers.ModelSerializer): class Meta: model = Group fields = ('id', 'name') class UserSerializer(serializers.ModelSerializer): groups = GroupSerializer(many=True) phone = serializers.CharField(source='profile.phone', read_only=True) name = serializers.CharField(source='profile.name', read_only=True) menus = serializers.SerializerMethodField() is_active = serializers.BooleanField(source='profile.is_cms_active') def get_menus(self, user): return get_menus(user) class Meta: model = User fields = ('id', 'username', 'name', 'email', 'phone', 'groups', 'menus', 'is_active')
一个请求的response
{ "id": 2, "username": "duoduo3369", "name": "", "email": "", "phone": "", "groups": [ { "id": 1, "name": "sysadmin" }, { "id": 17, "name": "大学2" } ], "menus": [ { "menu": [ { "menu": [], "codename": "information.announcement", "name": "通知公告", "order": 1 }, { "menu": [], "codename": "information.examinfo", "name": "考试信息", "order": 2 } ] } ], "is_active": false }
外键直接可以引用其他的serializer,例如group,可以看到response中group是嵌套的
外键的属性可以使用source,例如phone
不在原来model上的东西使用SerializerMethodField(或者在model上但是你要对这个值做一些特殊处理)
注意点
serializer可以做逻辑上的操作,然而最好不要做查询(你可以用SerializerMethodField做一些数据转换例如0变为假1变为真什么的,然而最好不要做复杂的数据库查询),这种事情可以在view上做好(注意可以用select_related减少多次查询),因为这是每一个model都要serializer一次。如果说跟前端对的修改和查询使用不同的serializer,那么你就写两个,不希望修改的字段加上readonly(或者放在readonly_fields里面)
serializer的逻辑很简单,想到复杂的东西再说。Done
相关文章推荐
- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- django使用ajax post数据出现403错误如何解决
- windows+apache+mod_python配置django运行环境
- python Django连接MySQL数据库做增删改查
- django自定义Field实现一个字段存储以逗号分隔的字符串
- 在Python的Django框架中加载模版的方法
- 在Django中使用Sitemap的方法讲解
- 详解Django中的form库的使用
- Django中的CACHE_BACKEND参数和站点级Cache设置
- 剖析Django中模版标签的解析与参数传递
- Python中DJANGO简单测试实例
- Python的Django框架中的数据库配置指南
- 在Django的上下文中设置变量的方法
- 在Python的Django框架中编写编译函数
- 在Django的URLconf中进行函数导入的方法
- Restful传递数组参数及注解大全
- SpringMVC restful 注解之@RequestBody进行json与object转换
- 在Python的Django框架中生成CSV文件的方法
- 在主机商的共享服务器上部署Django站点的方法
- 使用Python的Django框架中的压缩组件Django Compressor