UpdateAPIView无效:方法" PATCH"不允许

时间:2017-05-03 15:19:08

标签: python django rest django-rest-framework

我使用Django和 Django REST Framework 来实现 RESTful API

我现在拥有的:

  • ContentEntry型号
  • 我的ContentEntryCreateUpdateSerializer型号
  • ContentEntry序列化程序
  • ContentEntryCreate视图以创建一些ContentEntry ies
  • ContentEntryUpdate视图更新 ContentEntry ies

以下是代码:

from django.db import models
from rest_framework import serializers
from rest_framework import generics
from rest_framework.views import APIView
from my_api_app import views


# models.py
class ContentEntry(models.Model):
    content = models.ForeignKey(Content)
    quantity = models.IntegerField()
    container = models.ForeignKey(Container, related_name='content_entries')


# serializers.py
class ContentEntryCreateUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContentEntry
        fields = ('id', 'content', 'quantity', 'container')


# views.py
class ContentEntryCreate(generics.CreateAPIView):
    queryset = ContentEntry.objects.all()
    serializer_class = ContentEntryCreateUpdateSerializer


# views.py
class ContentEntryUpdate(generics.UpdateAPIView):
    queryset = ContentEntry.objects.all()
    lookup_field = 'id'
    serializer_class = ContentEntryCreateUpdateSerializer


# urls.py
urlpatterns = [
    url(r'content-entry', views.ContentEntryCreate.as_view()),
    url(r'content-entry/(?P<id>\d+)$', views.ContentEntryUpdate.as_view()),
]

一切正常,但 ContentEntryUpdate总是会返回错误

HTTP/1.1 405 Method Not Allowed
Allow: POST, OPTIONS
Content-Type: application/json
Date: Wed, 03 May 2017 14:40:03 GMT
Server: WSGIServer/0.2 CPython/3.6.1
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

{"detail":"Method \"PATCH\" not allowed."}

正如您在Allow属性中看到的那样,服务器似乎只允许使用POSTOPTIONS方法。

由于generics.UpdateAPIView定义了putpatch方法,因此非常奇怪。

我不认为这是一个许可问题,因为我允许所有内容:

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny'
    ]
}

我应该怎样做以允许HTTP PATCHPUT方法

1 个答案:

答案 0 :(得分:4)

请务必使用开头和结尾(^和$符号)标记网址。

这里发生的是没有结束标记,r'content-entry'匹配“/ content-entry / 4 /”,因此调用创建视图。

使用:r'^content-entry$'r'^content-entry/(?P<id>\d+)$'代替。