2015-02-09 98 views
2

我希望能够使用相同的请求创建或更新对象。手术应该是幂等的。django rest框架PUT返回404而不是创建对象

如果对象存在但是如果对象不存在,则向DRF发送PUT请求按预期工作我得到一个404而不是创建它。

models.py:

class Btilog(models.Model): 
    md5hash = models.CharField(primary_key=True, max_length=32) 
    vteip = models.ForeignKey('vte.VTE') 
    timestamp = models.DateTimeField(blank=False) 
    source = models.TextField() 
    code = models.CharField(max_length=10, blank=False) 
    msg = models.TextField(blank=False) 

api.py:

class BtilogSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = models.Btilog 

class BtilogVSet(viewsets.ModelViewSet): 
    queryset = models.Btilog.objects.all() 
    serializer_class = BtilogSerializer 
    permission_classes = (permissions.AllowAny,) 

urls.py:

... 
router = routers.DefaultRouter() 
router.register(r'btilog', api.BtilogVSet) 

urlpatterns = patterns('', 
    url(r'^api/', include(router.urls)), 
    ... 
) 

失败的请求

http --form PUT http://192.168.10.121:8888/logger/api/btilog/60c6b9e99c43c0bf4d8bc22d671169b1/ vteip='172.25.128.85' 'code'='Test' 'md5hash'='60c6b9e99c43c0bf4d8bc22d671169b1' 'timestamp'='2015-05-31T13:34:01' msg='Test' source='Test' 
HTTP/1.0 404 NOT FOUND 
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS 
Content-Type: application/json 
Date: Mon, 09 Feb 2015 15:16:47 GMT 
Server: WSGIServer/0.1 Python/2.7.6 
Vary: Accept, Cookie 

{ 
    "detail": "Not found" 
    } 

如下所述:http://restcookbook.com/HTTP%20Methods/put-vs-post/放的正确的行为应该是创建对象,如果不存在的话。

使用DRF的可浏览API工具发出相同的错误以发出请求。 DRF的行为是否也一样?我做错了什么?

回答

2

好吧,也许你应该尝试覆盖你的modelviewset,其处理HTTP PUT方法内更新方法:

class BtilogVSet(viewsets.ModelViewSet): 
    queryset = models.Btilog.objects.all() 
    serializer_class = BtilogSerializer 
    permission_classes = (permissions.AllowAny,) 

    def update(self, request, *args, **kwargs): 
     try: 
      instance = Btilog.objects.get(pk=kwargs['pk']) 
      serializer = serializers.BtilogSerializer(instance=instance,data=request.data) 
      if serializer.is_valid(): 
       btilog=serializer.save() 
       return Response(serializer.data,status=status.HTTP_200_OK) 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
     except Btilog.DoesNotExist: 
      serializer = serializers.BtilogSerializer(data=request.data) 
     if serializer.is_valid(): 
      btilog=serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
相关问题