Вопрос:

метод удаления и обновления не работает в не django остальные рамки

django python-3.x django-models django-rest-framework

137 просмотра

1 ответ

6 Репутация автора

Я пытаюсь построить API, используя методы DRF, get () и post (), но методы удаления и обновления не работают.
Я получаю эту ошибку:

Ошибка типа: 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()),]
Автор: abhinavsharma1494 Источник Размещён: 06.01.2018 08:38

Ответы (1)


0 плюса

135 Репутация автора

У тебя urls.pyнет pkаргументов MenuListни за, ни за MenuItemList.

Поэтому, когда вы не предоставляете pk в своем запросе, он не может быть получен в вашем коде.

Но способ, которым вы реализовали методы DELETE в своих списках, также кажется, что вы действительно хотите удалить объект, что делается в соответствующих подробных видах (и вы уже реализовали его там же).

Возможно, вы также захотите использовать общие представления DRF , которые автоматически позаботятся о большинстве вещей, которые вы делаете в своем коде.

Автор: Info-Screen Размещён: 06.01.2018 12:21
Вопросы из категории :
32x32