删除和更新方法不在django rest框架中工作

时间:2018-01-06 08:38:59

标签: django python-3.x django-models django-rest-framework

我正在尝试使用DRF构建API,get()和post()方法工作正常,但删除和更新方法不起作用。
我收到了这个错误:

  

TypeError:delete()缺少1个必需的位置参数:' pk'

views.py文件

class MenuList(APIView):

def get(self, request):
    menu = Menu.objects.all()
    serializer = MenuSerializer(menu, many=True)
    return Response(serializer.data)

def post(self, request):
    serializer = MenuSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, pk):
    menu = self.get_object(pk)
    menu.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

class MenuDetail(APIView):

""" Retrieve, update or delete a Menu instance."""

def get_object(self,pk):
    try:
        return Menu.objects.get(pk=pk)
    except Menu.DoesNotExist:
        raise Http404

def get(self, request,pk):
    menu = self.get_object(pk)
    menu = MenuSerializer(menu)
    return Response(menu.data)

def put(self, request, pk):
    menu = self.get_object(pk)
    serializer = MenuSerializer(menu, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_404_BAD_REQUEST)

def delete(self, request, pk):
    menu = self.get_object(pk)
    menu.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

class MenuItemList(APIView):

def get(self, request):
    menuitem = MenuItem.objects.all()
    serializer = MenuItemSerializer(menuitem,  many=True)
    return Response(serializer.data)

def post(self, request):
    serializer = MenuItemSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, pk):
    menuitem = self.get_object(pk)
    menuitem.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

class MenuItemDetail(APIView):

def get_object(self,pk):
    try:
        return MenuItem.objects.get(pk=pk)
    except MenuItem.DoesNotExist:
        raise Http404

def get(self, request, pk):
    menuitem = self.get_object(pk)
    menuitem = MenuItemSerializer(menuitem)
    return Response(menuitem.data)

def put(self, request, pk):
    menuitem = self.get_object(pk)
    serializer = MenuItemSerializer(menuitem, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_404_BAD_REQUEST)

def delete(self, request, pk):
    menuitem = self.get_object(pk)
    menuitem.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

models.py文件

class Menu(models.Model):
name = models.CharField(max_length=32, unique=True)
description = models.CharField(max_length=200)
chef = models.ForeignKey(User, on_delete=models.CASCADE)
available = models.BooleanField(default=False)

def __str__(self):
    return '{} {} {}' .format(self.name, self.chef.first_name, 
                              self.chef.last_name)

class MenuItem(models.Model):
name = models.CharField(max_length=32, unique=True)
description = models.CharField(max_length=200)
cost_to_make = models.DecimalField(decimal_places=2, max_digits=5)
sale_price = models.DecimalField(decimal_places=2, max_digits=5)
available = models.BooleanField(default=False)
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)

def __str__(self):
    return self.name

url.py文件

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Menu/', views.MenuList.as_view()),
url(r'^Menu/(?P<pk>[0-9]+)/$', views.MenuDetail.as_view()),
url(r'^MenuItem/',views.MenuItemList.as_view()),
url(r'^MenuItem/(?P<pk>[0-9]+)/$', views.MenuItemDetail.as_view()),]

1 个答案:

答案 0 :(得分:0)

urls.pypkMenuList没有MenuItemList个参数。

因此,如果您未在请求中提供pk,则无法在您的代码中收到pk。

但是你在列表中实现DELETE方法的方式似乎也是你真的要删除一个Object,它们在相应的详细视图中完成(你已经在那里实现了它)。

您可能还想使用DRF's Generic views,它会自动处理您在代码中执行的大部分操作。