Reputation: 672
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
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