【问题标题】:Post LIST OF OBJECTS from HTML/axios with multipart/form-data to DRF multipart parser将带有多部分/表单数据的 HTML/axios 的对象列表发布到 DRF 多部分解析器
【发布时间】:2019-11-16 09:49:03
【问题描述】:

这是我的序列化器:

class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer(many=True)  # reverse FK relation

ParentSerializer 也有一个 image 字段,所以请求必须是 multipart/form-data 以支持单个请求中的图像和数据。

以下代码/测试工作正常:

test_data = QueryDict('', mutable=True)
dictionary = {
    'name': ['test'],
    'children[0]': [{'key1': 'val1', 'key2': 'val2'}]
}
test_data.update(MultiValueDict(dictionary))

test_serializer = self.get_serializer(data=test_data)
test_serializer.is_valid(raise_exception=True)
test_instance = test_serializer.save()

...因为我正在手动创建children 列表。

问题是我不能通过 axios/HTML 表单做同样的事情。正在发送的数据被转换为字符串。

我有哪些选择?我想发送子对象列表以及其他数据。

DRF v3.9 & Django v2.2.

【问题讨论】:

  • 看看这是否有帮助stackoverflow.com/questions/32960870/…
  • 添加ChildSerializerviewset/view,如果有错误回溯。
  • 请发布您的请求。请求正文(即字段名称)很可能不适合 DRF。同时发布您遇到的任何错误。
  • 我现在已经实现了一个解决方法,但我希望它可以与 field_name[0][key_one] field_name[0][key_two] field_name[1][key_one] 等字段名称一起使用...... DRF/MultipartParser 能够检测到有多个field_name 字段,但无法检测到数组中的键,即key_onekey_two,并抛出错误,这两个字段都是必需的(或者如果字段是可选的,但没有注册,则没有任何内容这些值)。
  • 请注意,我指的是MultipartParser,而不是JSONParser。 JSON 是直截了当的,但在multipart/form-data 中,使用每个键发送的值必须 是字符串。所以我不能像{"field_name": [{"key": "value", "key2": "value"}, {"key": "value2"...}...]}那样发送JSON,因为它在请求中变成[Object Object],因为它不能解析字符串以外的任何东西。

标签: html django api django-rest-framework multipartform-data


【解决方案1】:

您的字段必须以以下形式命名:children[0]key1children[0]key2children[1]key1children[1]key2

注意]和键名之间没有点.

【讨论】:

  • 这绝对值得一篇博文,因为它是我能找到的关于使用 multipart 处理将复杂对象列表发布到 DRF 的第一个参考!
猜你喜欢
  • 2020-09-03
  • 2010-11-07
  • 2022-11-19
  • 2016-11-08
  • 2018-12-06
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多