2016-04-21 106 views
4

我有问题让嵌套的ModelSerializer被Django rest框架正确序列化。嵌套序列化器在父JSON对象内成为OrderedDict。DRF - 序列化对象中的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 

工厂:

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) 

测试:

fuf = FileUploadFactory() 
serializer = FileUploadSerializer(instance=fuf, context=serializer_context) 
import pdb; pdb.set_trace() 

结果:

(Pdb) serializer.data 
{'owner': 185, 'filetype': OrderedDict([('id', 8855), ('name', u'dFokZyReaOcwCDjAVwxGYhZNVpgOZKeaKRaMWKKHxIDZxceUWr'), ('description', u'ZNOCugfyRaWPGGmfoqZEzoBLknRBVdXyXgYwIFKBJAVuQQKppTiGVMKfgjcjCiUlzmNGFLNQiHIiCEIpydCCtfoWnqrgKOlTZXfUeYLKZgNatsxrRXyWkAEkZmfBjvFFPXcBRshcqIyHMxgHjGjCDBPLJZnEevUXIRAfBnJiLQyHblHONZllglgXhzashLqCvzmNitfN')]), 'datafile': None, 'id': 4960, 'created': '2016-04-21'} 

编辑

对不起,应该可能更具体的什么是实际问题。问题是,从

response = self.client.post(url, serializer.data, format='multipart') 

回应说:“文件类型”是必填字段 - 即它不beeing正确jsonified什么的。

步进深入的(来自django.test.Client),该代码在encode_multipart

(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'} 

所以似乎文件类型键的值不被编码。

+0

那么,有什么问题吗?一旦你在对象上调用了'json.dumps(serializer.data)',命令就会被忘记(与大多数数据类型相同)。 – C14L

+0

对不起,我看不清楚。我已更新原始帖子。 – bumby

回答

0

使用本

filetype = FileTypeSerializer(allow_empty_file=True,required=False)