2015-02-09 91 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) 
相關問題