curiousdev
curiousdev

Reputation: 636

Django Rest Framework PUT request returns 500, but updates data

I'm fairly new to Django REST framework and I've tried to write an API for my mobile application. I'm facing an issue where a PUT request works fine (updates data) apart from the fact it returns response 500 (Internal Server Error). Some guidance towards resolving this would be much appreciated.

views.py:

@csrf_exempt
def category_instance(request, pk):
    """
    Returns Category instance
    """
    try:
        cat = Category.objects.get(pk=pk)
    except Category.DoesNotExist:
        return HttpResponse("Error: category does not exist", status=404)

    if request.method == 'GET':
        serializer = CategorySerializer(cat, many=False)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'PUT':
        serializer = CategorySerializer(cat, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, 200)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        cat.delete()
        return HttpResponse(status=204)

    else:
        return HttpResponse(status=400)

models.py:

class Category(models.Model):
    name = models.CharField(max_length=25, blank=False)

    class Meta:
        ordering = ('id',)

serializers.py:

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name')

urls.py:

urlpatterns = [
    path('category/<int:pk>/', views.category_instance)
]

I've tried to look for similar issues that other people may have had, but I was unable to construct a solution to my problem.


Traceback:

Internal Server Error: /category/1/
Traceback (most recent call last):
  File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\exception.py", line 34,
 in inner
    response = get_response(request)
  File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\base.py", line 126, in
_get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\base.py", line 124, in
_get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, i
n wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\vaida\Documents\Coding\android-tm-api\android_tm_api\api\views.py", line 146, in category_instance
    serializer = CategorySerializer(cat, data=request.data)
AttributeError: 'WSGIRequest' object has no attribute 'data'

Upvotes: 2

Views: 2901

Answers (1)

curiousdev
curiousdev

Reputation: 636

The issue was resolved by replacing the views with generic class-based views instead.

Upvotes: 1

Related Questions