我正在尝试使用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()),]
答案 0 :(得分:0)
urls.py
对pk
或MenuList
没有MenuItemList
个参数。
因此,如果您未在请求中提供pk,则无法在您的代码中收到pk。
但是你在列表中实现DELETE方法的方式似乎也是你真的要删除一个Object,它们在相应的详细视图中完成(你已经在那里实现了它)。
您可能还想使用DRF's Generic views,它会自动处理您在代码中执行的大部分操作。