django Serializer 对象没有属性

Jac*_*cki 4 python django serialization

我在 python 方面没有太多经验,但是有任务在 django 中编写服务器,它将处理我从前端发送的 api 请求,问题是 eventho GET 运行良好,POST 仍然会抛出一些错误。如果我通过管理面板添加新徽标,它会起作用,当我尝试通过邮递员这样做时,它会抛出此错误:

Traceback (most recent call last):
  File "/home/user/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/user/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/user/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/user/.local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/user/.local/lib/python3.6/site-packages/rest_framework/viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/user/.local/lib/python3.6/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/home/user/.local/lib/python3.6/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/user/.local/lib/python3.6/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/home/user/.local/lib/python3.6/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)

AttributeError: 'LogoSerializer' object has no attribute 'name'
Run Code Online (Sandbox Code Playgroud)

我的代码:已编辑

class LogoViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Logo.objects.all()
        serializer = LogoSerializer(queryset, many=True)
        return Response(serializer.data)
    
def create(self, request):
    serializer = LogoSerializer(data=request.data)

    if serializer.is_valid():
        
        bg = LogoSerializer(
            name=serializer.name,
            thumb=serializer.thumb,
            thumbL=serializer.thumbL,
            dataL=serializer.dataL,

            )   
        bg.save()
    else:
        bg = serializer.errors
        # print(bg)

    return Response(bg)
Run Code Online (Sandbox Code Playgroud)

和序列化器:

class LogoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Logo
        fields = ('name', 'thumb', 'thumbL', 'dataL')

        def create(self, validated_data):
            return Logo.objects.create(**validated_data)
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 5

您不通过属性访问序列化程序数据,而是通过datadict访问它。

但根本没有必要这样做。您的序列化程序已经包含用于创建的代码,您应该保存它。

def create(self, request):
    serializer = LogoSerializer(data=request.data)
    if serializer.is_valid():
         bg = serializer.save()
Run Code Online (Sandbox Code Playgroud)

但你甚至不需要这样做。ViewSet 已经为你做了这件事。无需在该视图集上定义任何一个listcreate方法。

序列化器create方法也无关紧要。