Jacki
Jacki

Reputation: 672

django Serializer object has no attribute

I don't have much experience in python but got task to write server in django which will handle api requestes I sent from front part, the thing is that eventho GET works well, POST still throw some errors. If I add new Logo via admin panel, it works, when I try to do so via postman it throw this error:

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'

my code: EDITED

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)

and Serializer:

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

        def create(self, validated_data):
            return Logo.objects.create(**validated_data)

Upvotes: 5

Views: 23571

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599510

You don't access serializer data via attributes, you access it via the data dict.

But there is no need for this at all. Your serializer already contains the code for creating, you should just save it.

def create(self, request):
    serializer = LogoSerializer(data=request.data)
    if serializer.is_valid():
         bg = serializer.save()

But you don't even need to do this. The ViewSet already does this for you. There is no need to define either list or create methods on that viewset.

The serializer create method is also irrelevant.

Upvotes: 5

Related Questions