попробуйте и, за исключением того, что не работает в Django APIView

#django #api #exception #django-rest-framework #django-views

Вопрос:

Я написал логику для удаления элемента в окне просмотра Django. Логика состоит в том, чтобы назначить этот элемент переменной и с помощью Try и Except. Это прекрасно работает, когда есть объект, но когда объекта нет, я получил сообщение об ошибке «leads.models.Lead.Не существует: запрос на соответствие лиду не существует».

Я должен был бы получить сообщение о том, что Сделка не существует со статусом 400, как у меня было внутри, за исключением. Я получаю 500 ошибок в посте.

 def delete(self, request,pk, *args, **kwargs):
    id = pk
    lead = Lead.objects.get(id=id)
    # abc.delete()
    # return Response({"message": "Lead has been deleted"},
    #                 status=status.HTTP_200_OK)

    try:
        lead = Lead.objects.get(id=id)
        if lead.delete():
            return Response({
                "message": "Deals has been deleted"
            },status=status.HTTP_204_NO_CONTENT)
    except lead.DoesNotExist:
        return Response({
            "message": "Deal doesnt exist"
        },status=status.HTTP_400_BAD_REQUEST)
 

Мои URL-адреса являются:

 path('lead/<int:pk>', ChunksLeadCreate.as_view()),
 

Я надеюсь, что этого кода достаточно, чтобы устранить проблему.

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

1. Я попытался, как вы сказали, но все равно получил ту же ошибку 500 в почтальоне.

2. У вас есть еще lead = Lead.objects.get(id=id) один вызов, который находится за пределами блока попыток. Это может привести к 500

3. Только что проверил это, я тоже был не прав. Вы также можете использовать lead.DoesNotExist (из экземпляра), но это будет работать только в том случае, если вам удастся получить объект и в итоге получить lead объект, поэтому все равно лучше использовать его из класса модели ( Lead.DoesNotExist )

4. да, это создавало проблему, я понял. Но почему задание снаружи может привести к ошибкам?? запутался….??

5. Потому что, если идентификатор, который вы используете, не существует, а вызов get() находится за пределами попытки, то django по умолчанию поднимет 500.

Ответ №1:

Я прокомментировал назначение свинца перед свинцом.Не существует, и это сработало.

  def delete(self, request,pk, *args, **kwargs):
        id = pk
        # lead = Lead.objects.get(id=id)
        # abc.delete()
        # return Response({"message": "Lead has been deleted"},
        #                 status=status.HTTP_200_OK)

        try:
            lead = Lead.objects.get(id=id)
            if lead.delete():
                return Response({
                    "message": "Deals has been deleted"
                },status=status.HTTP_204_NO_CONTENT)
        except Lead.DoesNotExist:
            return Response({
                "message": "Deal doesnt exist"
            },status=status.HTTP_400_BAD_REQUEST)