UpdateAPIView 不起作用:不允许使用方法“PATCH”

Gui*_*TeK 4 python django rest django-rest-framework

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

我现在所拥有的:

  • 一个ContentEntry模型
  • 一种 ContentEntryCreateUpdateSerializer我的ContentEntry模型序列化程序
  • 一个ContentEntryCreate视图中创建一些ContentEntryIES
  • ContentEntryUpdate视图更新ContentEntryIES

这是代码:

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()),
]
Run Code Online (Sandbox Code Playgroud)

一切正常,除了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."}
Run Code Online (Sandbox Code Playgroud)

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

这很奇怪,因为generics.UpdateAPIView定义了putpatch方法。

我不认为这是一个许可问题,因为我允许一切:

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny'
    ]
}
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能允许 HTTPPATCHPUT方法

Lin*_*via 6

请确保用开始和结束(^ 和 $ 符号)标记 URL。

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

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