Skip to main content
 首页 » 编程设计

python之Django Rest Framework PUT 请求返回 500,但更新数据

2024年12月31日19zhwl

我是 Django REST 框架的新手,我曾尝试为我的移动应用程序编写 API。除了返回响应 500(内部服务器错误)之外,我正面临 PUT 请求工作正常(更新数据)的问题。非常感谢一些解决此问题的指导。

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) 

模型.py:

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

序列化程序.py:

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

urls.py:

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

我试图寻找其他人可能遇到的类似问题,但我无法为我的问题构建解决方案。


回溯:

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' 

请您参考如下方法:

通过将 View 替换为 generic class-based views 解决了该问题相反。