Как отправить атрибут FormData с массивом строк из React Client в Django + Django Rest Framework API

Как я могу отправить данные JSON.stringify (массив) в данные формы и декодировать JSON с помощью моего Django api?

Я пытаюсь добавить функциональность для загрузки массива строк даты в форме

Первоначально мы отправляли данные сообщения с помощью JSON, и отправка массивов данных работала, однако, когда мы переключились на использование данных формы, чтобы упростить загрузку изображения, у нас начались проблемы с типами массивов.

поскольку данные формы должны быть отправлены с использованием строкового типа, я преобразовал массив строки даты с помощью JSON.stringify ()

const myForm = new FormData();
myForm.set("date_strings", JSON.stringify(dateStrings));

когда я отправляю myForm в свой Django + DRF API, он отвечает

{
    "date_strings": [
        "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."
    ],
    "status_code": 400
}

В Postman я проверил, что отправка одной строки даты работает, но когда я отправляю массив строк, я получаю ту же ошибку.

Я считаю, что мой Django API проверяет, действителен ли request.data, видит, что date_strings является строкой JSON, а затем отвечает с ошибкой 400.

        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)

Попытки решения:

  1. преобразование строки JSON в массив в методе создания PostViewset
    • Я не могу изменить request.data['publish_dates'], потому что он не изменяемый, и я видел несколько советов, что вам не следует пытаться копировать или изменять данные запроса в наборе просмотра, потому что это небезопасно.
  2. преобразовать строку JSON в массив в сериализаторе

    • ни методы создания, ни проверки MySerializer не работают (я вошел в систему для тестирования).
    • date_strings формируются и создаются как отдельная модель PublishDate в методе create,

      class MySerializer(MyChildSerializer):
          date_strings = serializers.ListField(child=serializers.DateTimeField(), min_length=1, max_length=100, write_only=True)
      

Как я могу отправить / принять данные формы в мой Django + DRF API, если один атрибут представляет собой массив строк даты и времени?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
991
1

Ответы 1

Я осознал проблему и нашел решение. Поскольку MySerializer установил date_strings как ListField, он поступал как строка и отклонялся как неверный запрос.

изменяя модель date_strings на CharField, MySerializer запускает методы проверки и создания. Теперь мне нужно найти способ преобразовать JSON date_strings обратно в массив в методе создания сериализатора, но я решил проблему API 400.

MySerializer теперь выглядит так:

class CreatePostSerializer(SocialVeilModelSerializer):
     publish_dates = serializers.CharField(max_length=2000)

Другие вопросы по теме