bum*_*mby 5 django serialization django-rest-framework
我在让 Django rest 框架正确序列化嵌套的 ModelSerializer 时遇到问题。嵌套的序列化程序成为父 JSON 对象内的 OrderedDict。
我已经尝试过 Meta.depth 值,但它似乎没有任何区别。
单独创建 FileTypeSerializer 将生成正确格式的 JSON 对象。
有什么建议?
序列化器:
class FileTypeSerializer(serializers.ModelSerializer):
class Meta:
model = FileType
class FileUploadSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(
read_only=True,
slug_field='id'
)
filetype = FileTypeSerializer()
class Meta:
model = FileUpload
read_only_fields = ('created', 'datafile', 'owner', 'filetype')
depth = 1
Run Code Online (Sandbox Code Playgroud)
工厂:
class FileTypeFactory(factory.DjangoModelFactory):
class Meta:
model = FileType
id = fuzzy.FuzzyInteger(1, 9999)
name = fuzzy.FuzzyText(length=50)
description = fuzzy.FuzzyText(length=200)
class FileUploadFactory(factory.DjangoModelFactory):
class Meta:
model = FileUpload
id = fuzzy.FuzzyInteger(1, 9999)
filetype = factory.SubFactory(FileTypeFactory)
owner = factory.SubFactory(UserFactory)
Run Code Online (Sandbox Code Playgroud)
测试:
fuf = FileUploadFactory()
serializer = FileUploadSerializer(instance=fuf, context=serializer_context)
import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
结果:
(Pdb) serializer.data
{'owner': 185, 'filetype': OrderedDict([('id', 8855), ('name', u'dFokZyReaOcwCDjAVwxGYhZNVpgOZKeaKRaMWKKHxIDZxceUWr'), ('description', u'ZNOCugfyRaWPGGmfoqZEzoBLknRBVdXyXgYwIFKBJAVuQQKppTiGVMKfgjcjCiUlzmNGFLNQiHIiCEIpydCCtfoWnqrgKOlTZXfUeYLKZgNatsxrRXyWkAEkZmfBjvFFPXcBRshcqIyHMxgHjGjCDBPLJZnEevUXIRAfBnJiLQyHblHONZllglgXhzashLqCvzmNitfN')]), 'datafile': None, 'id': 4960, 'created': '2016-04-21'}
Run Code Online (Sandbox Code Playgroud)
编辑
抱歉,应该更具体地说明实际问题是什么。问题是来自
response = self.client.post(url, serializer.data, format='multipart')
Run Code Online (Sandbox Code Playgroud)
说“文件类型”是一个必填字段 - 即它没有正确 jsonified 或其他东西。
在encode_multipart 中深入研究post的代码(来自 django.test.Client)
(Pdb) lines
['--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="id"', '', '814', '--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="owner"', '', '193', '--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="filetype"', '', 'id', '--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="filetype"', '', 'name', '--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="filetype"', '', 'description', '--BoUnDaRyStRiNg', 'Content-Disposition: form-data; name="created"', '', '2016-04-21']
(Pdb) data
{'owner': 193, 'filetype': OrderedDict([('id', 1335), ('name', u'YdmXrMnxeXjzKxYhlLgaGClqTVMbTJIeMvWvQRLWUsVHWQQbFL'), ('description', u'YrmwBkwFhXGqWCNCjUIQdnBHaPQXqAhIXnOaycknMzFZPjWrWtrhYbWYBKdYDJWnRntPNjQranWjbwdBJPnKPLxAbWInfOrGZyGwDaMvlWCVMmylwxzPxCtMRkYJfuetQnvdbcheXQiRWqzFNfrKrWlcpSakmCmxFdsYBjnlxLByfulBBdiGqRdjOvkMxiUWDxasEgdT')]), 'datafile': None, 'id': 814, 'created': '2016-04-21'}
Run Code Online (Sandbox Code Playgroud)
所以似乎文件类型键的值没有被编码。
用这个
filetype = FileTypeSerializer(allow_empty_file=True,required=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |