Django Rest框架拒绝接受多部分表单数据

zac*_*mwa 5 python django json django-rest-framework

我正在尝试发布具有嵌套json,图像和其他数据的数据。json看起来像这样:

{
    "id": ,
    "venue": {
        "id": ,
        "name": "",
        "city": "",
        "address": "",
        "rating": null,
        "point": null
    },
    "name": "",
    "time": "",
    "event_pic": null,
    "description": "",
    "event_type": "Movie",
    "invite_only": ,
    "free": ,
    "age_restriction": ,
    "ticket_price": ,
    "user": 
}
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题,由于某种原因,如果我尝试使用分段表单上传,则会收到如下错误消息:

Request http://zacmwa.pythonanywhere.com/api/events/ (7417ms)
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Server: openresty/1.9.15.1
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Date: Tue, 14 Feb 2017 13:21:26 GMT
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Content-Type: application/json
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Transfer-Encoding: chunked
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Connection: keep-alive
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Vary: Accept
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: X-Frame-Options: SAMEORIGIN
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Allow: GET, POST, OPTIONS
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: {"venue":["This field is required."]}
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: <-- END HTTP (37-byte body)
Run Code Online (Sandbox Code Playgroud)

它显示{“ venue”:[“必填字段。”]},并向我发送了400错误请求。

当我从邮递员发送邮件时,无法以多部分形式发送邮件,但是当我使用application / json标头时,我可以解决此问题,但是当使用application / json标头时,我无法发送图像。

为什么没有看到json对象被发送?DRF如何希望发送嵌套对象?

以可浏览的api形式,我可以轻松创建嵌套的json对象和图像,而无需进行任何更改。如何为其他客户执行此操作?

Lin*_*via 5

TL;DR:你还不能这么做。

更长的版本:

您无法将图像与开箱即用的 JSON 一起发送。Multipart 不支持 JSON(参见https://github.com/tomchristie/django-rest-framework/issues/4881)。

另一种方法是使用表单和图像,但表单目前不支持嵌套数据。

在 JSON 中发送的 Base 64 编码图像可能有一些解决方法,但我还没有使用过这些方法,所以我不能说这是否是一个好的选择。

PS:您的问题是因为它以表单编码的形式发送数据。由于它不支持嵌套数据,它会抱怨您的字段不起作用。