我正在使用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
数组为空。
这可能是什么问题?
答案 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')