【问题标题】:Using the PATCH method with Django Rest Framework在 Django Rest Framework 中使用 PATCH 方法
【发布时间】:2020-05-01 13:39:11
【问题描述】:

我设置了 Django Rest Framework,我希望能够向它发送更新特定字段的 PATCH 请求。我查看了一些以前的帖子,并在我的视图中合并了partial update 代码:

class RequestViewSet(viewsets.ModelViewSet):
    queryset = Request.objects.filter(done = False).order_by('-time')
    serializer_class = RequestSerializer
    paginate_by = None

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

但是,当我尝试使用 PATCH 运行 curl 请求时,对象没有得到更新。这是我使用的 curl 示例:

curl --data '{"request": "foo"}' -X PATCH http://127.0.0.1:8000/api/request/1/

在终端中,它返回原始的、未修改的对象。是否有其他方法可以设置 Model ViewSet 以通过 PATCH 接受部分更新?

【问题讨论】:

  • 是的,这实际上是我得到 curl 格式的地方。不过,我是从 Nick Brady 的评论中得出的,因为顶级评论似乎没有包含包含数据的方法。我尝试在 url 之后添加它并引发错误。
  • 错误是什么,命令是什么?听起来问题出在您的 curl 命令上。它在 Django shell(你正在执行的 ./manage.py runserver 的地方)中表示了什么样的请求
  • 我认为你部分正确。我在原始 curl 中有一个语法错误,引发了错误。使用这个curl --request PATCH http://127.0.0.1:8000/api/request/1/?done=True,它返回原始对象而不将done 更改为true。 (为了它的价值,我尝试了大写和小写 true。)
  • 您在原始帖子中显示的 curl 命令显示您尝试将 request 更改为 foo。您是否无法向该 curl 命令添加 --data 参数? curl --request PATCH http://127.0.0.1:8000/api/request/1/ --data '{"done": "True"}'

标签: python django curl django-rest-framework


【解决方案1】:

在意识到我参加派对有多晚之前,我对 OP 发表了评论……但我确实明白了。似乎 DRF 的 curl 语法有点挑剔。

经过多次实验,我发现这行得通。 (是的,XPATCH 是一个词):

curl -XPATCH -H 'Content-Type:application/json' --data '{"request": "foo"}' \
http://127.0.0.1:8000/api/request/1/

【讨论】:

  • 工作正常。如果有人想知道,在 Windows 上,您必须将双引号替换为三重双引号,并将单引号替换为双引号。
  • @Endre - 好信息。我没有 Windows 机器,所以我什至不会想到它。感谢发帖!
【解决方案2】:

如果您不想弄乱内容类型的东西,您可能会发现这很有效(请注意,不需要XPATCH):

curl -X PATCH --data 'published=True' \
    http://127.0.0.1:8000/api/rest/v3/visualizations/14/

至少在我看来,使用--data 标志在命令行上感觉更干净一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2017-04-14
    • 2020-07-08
    • 2014-07-01
    • 2019-10-27
    • 2019-02-12
    • 2015-06-15
    相关资源
    最近更新 更多