Как сохранить многочастичные / форменные данные, превращенные в 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)