restframework创建嵌套的序列化
我们将要给Course模型创建一个序列化。编辑api/serializers.py文件并添加以下代码:
from ..models import Course
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'subject', 'title', 'slug', 'voerview',
'created', 'owner', 'modules')
让我们看下一个Course对象是如何被序列化的。打开shell,运行python manage.py shell,然后运行以下代码:
from rest_framework.renderers import JSONRenderer
from courses.models import Course
from courses.api.serializers import CourseSerializer
course = Course.objects.latest('id')
serializer = CourseSerializer(course)
JSONRenderer().render(serializer.data)
你将会通过我们包含在CourseSerializer中的字段获取到一个JSON对象。你可以看到modules管理器的被关联对象呗序列化成一列关键值,如下所示:
"modules": [17, 18, 19, 20, 21, 22]
我们想要包含个多的信息关于每一个模块,所以我们需要序列化Module对象以及嵌套它们。修改api/serializers.py文件提供的代码,使之看上去如下所示:
from rest_framework import serializers
from ..models import Course, Module
class ModuleSerializer(serializers.ModelSerializer):
class Meta:
model = Module
fields = ('order', 'title', 'description')
class CourseSerializer(serializers.ModelSerializer):
modules = ModuleSerializer(many=True, read_only=True)
class Meta:
model = Course
fields = ('id', 'subject', 'title', 'slug', 'overview',
'created', 'owner', 'modules')
我们给Module模型定义了一个ModuleSerializer去提供序列化。之后我们添加一个modules属性给CourseSerializer去嵌套ModuleSerializer序列化器。我们设置many=True去表明我们正在序列化多个对象。read_only参数表明这个字段是只读的并且不可以被包含在任何输入中去创建或者升级对象。
打开shell并且再次创建一个CourseSerializer的实例。使用JSONRenderer渲染序列化器的data属性。这一次,被排列的模块会被通过嵌套的ModuleSerializer序列化器给序列化,如下所示:
"modules": [
{
"order": 0,
"title": "Django overview",
"description": "A brief overview about the Web Framework."
},
{
"order": 1,
"title": "Installing Django",
"description": "How to install Django."
},
...
]
你可以找到更多关于序列化器的内容,通过访问 http://www.django-rest-framework.org/api-guide/serializers/。
-------------------------------------------------
class AutomationCaseApi(models.Model):
"""
用例执行接口
"""
id = models.AutoField(primary_key=True)
automationTestCase = models.ForeignKey(AutomationTestCase, on_delete=models.CASCADE,
verbose_name='用例', related_name="api")
name = models.CharField(max_length=50, verbose_name='接口名称')
httpType = models.CharField(max_length=50, default='HTTP', verbose_name='HTTP/HTTPS', choices=HTTP_CHOICE)
requestType = models.CharField(max_length=50, verbose_name='请求方式', choices=REQUEST_TYPE_CHOICE)
apiAddress = models.CharField(max_length=1024, verbose_name='接口地址')
requestParameterType = models.CharField(max_length=50, verbose_name='参数请求格式', choices=REQUEST_PARAMETER_TYPE_CHOICE)
formatRaw = models.BooleanField(default=False, verbose_name="是否转换成源数据")
examineType = models.CharField(default='no_check', max_length=50, verbose_name='校验方式', choices=EXAMINE_TYPE_CHOICE)
httpCode = models.CharField(max_length=50, blank=True, null=True, verbose_name='HTTP状态', choices=HTTP_CODE_CHOICE)
responseData = models.TextField(blank=True, null=True, verbose_name='返回内容')
class AutomationCaseApiSerializer(serializers.ModelSerializer):
"""
自动化用例接口详细信息序列化
"""
header = AutomationHeadSerializer(many=True, read_only=True)
parameterList = AutomationParameterSerializer(many=True, read_only=True)
parameterRaw = AutomationParameterRawSerializer(many=False, read_only=True)
class Meta:
model = AutomationCaseApi
fields = ('id', 'name', 'httpType', 'requestType', 'apiAddress', 'header', 'requestParameterType', 'formatRaw',
'parameterList', 'parameterRaw', 'examineType', 'httpCode', 'responseData')
----------------------------------------
data = AutomationCaseApiSerializer(AutomationCaseApi.objects.get(id=_id, automationTestCase=case_id)).data
print(json.dumps(data))
{
"id": 1,
"name": "接口名称1",
"httpType": "HTTP",
"requestType": "POST",
"apiAddress": "接口地址",
"header": [
{
"id": 1,
"automationCaseApi": 1,
"name": "请求头参数名1",
"value": "请求头内容1",
"interrelate": true
}
],
"requestParameterType": "raw",
"formatRaw": true,
"parameterList": [
{
"id": 1,
"automationCaseApi": 1,
"name": "参数名1",
"value": "内容1",
"interrelate": true
}
],
"parameterRaw": {
"id": 1,
"automationCaseApi": 1,
"data": "源数据请求参数"
},
"examineType": "json",
"httpCode": "200",
"responseData": "返回内容"
}

浙公网安备 33010602011771号