Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как в Django REST, AngularJs выполнить удаление не по id?

#django #angularjs #django_rest_framework


В urls.py 

url(r'^someurl/(?P\d+)/', MyApi.as_view(), name='delete')


где name='delete' - это имя функции 

Т.е. URL будет вида 

...someurl/123/


В views.py 

def delete(self, request, pk, format=None):
item = self.model.objects.get(pk=pk) 
item.delete() 
print(pk) 
return Response(status=status.HTTP_204_NO_CONTENT)


В контроллере вызываю 

$http.delete('someurl/' + id + '/');


При таком запросе удалится объект с номером = id

Но сейчас мне нужно удалить объект, не зная его id. Я знаю только значение поля image_url. 

Вызывать 

$http.delete('someurl/1/');


где 1 - это любое число, ни с чем не связанное, т.к. delete требует такого формата
вызова;
и передавать image_url в качестве дополнительного параметра в request? Таким образом:

$http.delete('someurl/1/', {'image_url': 'какой-то урл'});


Есть ли более элегантное решение, чем приписывать магическое число в конце?

Обновление:

При использовании 

$http.delete('someurl/1/', {'image_url': 'какой-то урл'});


и в view.py

def delete(self, request, pk, format=None):
    image_url = request.data['image_url']
    item = self.model.objects.get(image_url=image_url)
    item.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)


Возникает ошибка 403.

Обновление 2

class SortedItemsAPI(mixins.UpdateModelMixin, generics.ListCreateAPIView):
model = SortedItem

permission_classes = [
    permissions.IsAuthenticated
]

def get_serializer_class(self):
    if self.request.method in ['PUT', 'POST']:
        return SortedItemIdSerializerBasic
    return SortedItemSerializer

def get_queryset(self):
    return self.model.objects.filter(user=self.request.user).order_by('order')

def create(self, request, *args, **kwargs):
    data = {'user': request.user.id}
    data.update(request.data)
    serializer = self.get_serializer(data=data)

    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED,
                    headers=headers)

def put(self, request, *args, **kwargs):
    for order, element in enumerate(request.data['sorted']):
        self.model.objects.filter(
            user=request.user, id=element).update(
            order=order
        )
    print(request.data['sorted'])
    return Response(status=status.HTTP_200_OK)

def delete(self, request, pk, format=None):
    item = self.model.objects.get(item_id=pk)
    item.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)


Если меняю на 

 def delete(self, request, pk, format=None):
        item = self.model.objects.get(item_id=request.GET['id'])
        item.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


и, конечно, передаю в request.data параметр id, который в точности равен pk - возникает
ошибка 500 INTERNAL SERVER ERROR.
    


Ответы

Ответ 1



Если вы используете rest_framework, то можно использовать декоратор @list_route @list_route(method=['delete']) def remove_image(self, request): image_url = request.data['image_url'] item = self.model.objects.get(image_url=image_url) item.delete() return Response(status=status.HTTP_204_NO_CONTENT)

Комментариев нет:

Отправить комментарий