Django Rest Framework Serializer POST数据不接收数组

时间:2016-03-17 17:26:49

标签: django django-rest-framework

我正在使用DRF测试API来测试我的序列化程序,例如我创建了这样的数据:

image_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../media/', 'product_images/', 'myimage.png')
    with open(image_path) as image:
        encoded_image = base64.b64decode(image.read())
        data = {
            u'small_name': u'Product Test Case Small Name',
            u'large_name': u'Product Test Case Large Name',
            u'description': u'Product Test Case Description',
            u'images': [
                {u'image': encoded_image}
            ],
            u'variants': [
                {u'value': u'123456789'}
            ]
        }
response = self.client.post(url, data, 'multipart')

但是,当我收到相应序列化程序的数据时,variants数组和images数组为空。

这可能是什么问题?

4 个答案:

答案 0 :(得分:2)

尝试使用base64.b64encode()代替base64.b64decode()方法对图像进行编码。

encoded_image = base64.b64encode(image.read())

此外,发送内容类型设置为application/json的json编码数据。

self.client.post(url, json.dumps(data), content_type='application/json')

答案 1 :(得分:2)

您无法同时拥有图片上传和嵌套数据。 您要上传图像并使用多部分编码(HTML表单),这意味着您的数组将无法工作(除非它是外键或类似的列表)。这可以与JSon内容类型一起使用,但是你将失去上传图像的能力。您可以选择使用base64对图像进行编码并上传,但您必须在序列化程序上自定义一些内容。

答案 2 :(得分:2)

感谢Linovia和Rahul Gupta,我能够解决图像和数组问题。我使用django-extra-fields提供的序列化程序更改了序列化程序以接收Base64ImageField。 Rahul还在我的代码上指出了一个愚蠢的错误。 我会留下一些代码来帮助遇到同样问题的人。

serializers.py文件

from drf_extra_fields.fields import Base64ImageField


class ProductImageSerializer(serializers.ModelSerializer):
    source = Base64ImageField(source='image', required=False, )

test.py文件

image_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../media/', 'product_images/', 'myimage.png')
with open(image_path) as image:
    encoded_image = base64.b64encode(image.read())
        data = {
                u'small_name': u'Product Test Case Small Name',
                u'large_name': u'Product Test Case Large Name',
                u'description': u'Product Test Case Description',
                u'images': [
                    {u'source': encoded_image}
                ],
                u'variants': [
                    {u'value': u'123456789'}
                ]
            }

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

答案 3 :(得分:1)

您必须将client的{​​{3}}设置为JSON

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