【发布时间】: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