您的位置:首页 > 编程语言 > Go语言

Django REST framework的各种技巧——2.serializer

2016-02-01 19:18 726 查看
serializer只做一件事情,json化model对象,所以这一部分相当简单

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 restful