【问题标题】:delete and update method not working in not django rest framework删除和更新方法在非 django rest 框架中不起作用
【发布时间】:2018-01-06 08:38:58
【问题描述】:

我正在尝试使用 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()),]

【问题讨论】:

  • 您的代码似乎正确。你能确认runserver在代码更改后重新启动吗?。
  • 还要确保从客户端使用正确的休息请求方法。例如删除使用DELETE部分更新使用PATCH完全更新使用PUT
  • 服务器已启动并运行良好,但是当我尝试删除任何对象时,错误来了。
  • 客户端幻灯片传递的请求方法是什么? (是post吗?是delete吗?)
  • 帖子运行正常,但删除显示错误

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


【解决方案1】:

您的urls.py 没有pk 参数MenuListMenuItemList

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

但是您在 Lists 中实现 DELETE 方法的方式也似乎您实际上想要删除一个对象,这是在相应的详细视图中完成的(并且您也已经在那里实现了它)。

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

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 2018-06-18
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多