Как сохранить многочастичные / форменные данные, превращенные в QueryDict, используя Django REST Framework (DRF) и ModelSerializer

Я отправляю multipart/formdata из API Next.js и могу форматировать данные, как хочу, но мне трудно получить правильный формат.

На данный момент у меня есть следующие данные формы:

<QueryDict: {
    'name': ['Test Product'],
    'brands[0]': ['1'],
    'brands[1]': ['2'],
    'option_types[0]': ['1'],
    'product_variants[0]option_values[0]': ['1'],
    'product_variants[0]option_values[1]': ['2'],
 >

Мой ModelSerializer не принимает способ, которым я указываю списки/массивы. Например, если я пытаюсь сделать:

def validate_option_types(self, data):
    print(data)
    return data

Я получаю пустой список, что означает неправильный формат списка option_types, и то же самое относится к спискам product_variants и option_values. Я просто передаю QueryDict, полученный из request.data следующим образом:

def create(self, request, *args, **kwargs):
    serializer = ProductDetailAdminSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data)
    return JsonResponse(serializer.errors, status=400)

Сериализатор и все остальное работает нормально, если я использую JSON версию QueryDict выше и JSON content-type.

Подводя итог моему вопросу, какой правильный формат QueryDict (особенно для полей, представляющих списки) для DRF ModelSerializer? Или есть какой-то дополнительный шаг, который я упускаю, чтобы привести QueryDict к формату, ожидаемому сериализатором моделей.

ok, Вы не можете добавить поле типа "многие ко многим", как вы пытаетесь -

сначала создайте объект без многих-многих полей

obj = MyModal.save()

и затем вы можете сделать что-то вроде - чтобы создать и добавить ваши поля "многие ко многим".

obj.brand.create(name='val1')
obj.option_types.create(name='val2')

Вы также можете поискать на StackOverflow, как добавить данные в ManyToManyFields

Похоже, что PrimaryKeyRelatedField не может обрабатывать multipart/formdata нужным образом. Вот связанный вопрос .

Моим решением было преобразовать все данные формы, не относящиеся к файлам, в одну строку JSON из внешнего интерфейса, т.е.

const formData = new FormData();
formData.append('form_data', JSON.stringify(data));

и затем в Django, в функции create моего набора представлений, сделайте что-то вроде

data = ujson.loads(request.data.get("form_data"))
new_query_dict = QueryDict('', mutable=True)
new_query_dict.update(data)
Вернуться на верх