Многокомпонентные данные Django REST, преобразованные в строку
Передача данных JSON + изображение в конечную точку post заканчивается преобразованием части данных запроса в строку. Часть, преобразованная в строку, также содержит файл. Вот входные данные:
data = {
"external": "90000001",
"sales": [
{
"total": 4,
"quantities": {"xs":2, "s":4},
"product": {
"type": self.type.id,
"product_image": {
"name": "First test files",
"product_files": [
{
# "file": base64.b64encode(f.read()).decode(),
"file": test_file,
"description": "Patterns file.",
"type": "pattern_file",
}
]
},
},
}
],
}
Я посылаю запрос к моей конечной точке в тесте таким образом:
res: Response = self.client.post(self.create_ext_so_url, data)
Выдает ошибку:
rest_framework.exceptions.ValidationError: {'sales': [ErrorDetail(string='Must specify at least one sales', code='blank')]}
.
Вот данные о продажах, извлеченные в run_validation(...)
attrs.get("sales", [])
"{'total': 4, 'quantities': {'xs': 2, 's': 4}, 'product': {'type': 1, 'product_image': {'name': 'First test files', 'product_files': [{'file': <SimpleUploadedFile: test.svg (image/svg+xml)>, 'description': 'Patterns file.', 'type': 'pattern_file'}]}}}"
Здесь видно, что продажа преобразуется в строку и в дальнейшем она не будет доступна как объект/словарь и объект не будет создан, что приводит к провалу теста.
Вот вид, если кто-то хочет его проверить.
@action(detail=False, methods=["POST"], url_path="create-sales")
def create_sales_order(self, request: Request)-> Response:
ser_class = self.get_serializer_class()
ser = ser_class(data=request.data)
ser.is_valid(raise_exception=True)
ser.save()
return Response(ser.data, status=HTTP_201_CREATED)
Единственный способ решить эту проблему - иметь отдельные представления для обработки изображений и других текстовых полей. Я не могу видеть ваши представления, но предполагаю, что вы обрабатываете изображения и текстовые поля в одном и том же представлении.