vintasoftware / drf-rw-serializers

Generic views, viewsets and mixins that extend the Django REST Framework ones adding separated serializers for read and write operations
MIT License
177 stars 28 forks source link

Can't open API in web browser #44

Closed AndyAnderson91 closed 3 months ago

AndyAnderson91 commented 3 years ago

Description

Hi there! So the problem is mentioned in the tittle of the issue. Requests from terminal works fine, like http GET http://127.0.0.1:8000/api/v1/users/ and POST aswell, but in browser instead of standard DRF page i get TypeError.

Environment:

Request Method: GET
Request URL: http://localhost:8000/api/v1/users/

Django Version: 3.2.7
Python Version: 3.8.10
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'users_app.apps.UsersAppConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']

Traceback (most recent call last):
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 204, in _get_response
    response = response.render()
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/rest_framework/renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/rest_framework/renderers.py", line 655, in get_context
    raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request)
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/rest_framework/renderers.py", line 554, in get_raw_data_form
    serializer = view.get_serializer()
  File "/home/andy/programming/drf/users/env/lib/python3.8/site-packages/rest_framework/generics.py", line 110, in get_serializer
    return serializer_class(*args, **kwargs)

Exception Type: TypeError at /api/v1/users/
Exception Value: 'NoneType' object is not callable

My views.py

from django.contrib.auth.models import User
from users_app.serializers import ReadOnlyUserSerializer, WriteOnlyUserSerializer
from drf_rw_serializers import generics

class UsersList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    read_serializer_class = ReadOnlyUserSerializer
    write_serializer_class = WriteOnlyUserSerializer

Serializers and other app code must be fine, since it works correctly with usual generic classes.

What I Did

Adding serializer_class = ReadOnlyUserSerializer line to my views solves the problem, but this solution seems weird to me. I've read docs about installation and usage at https://drf-rw-serializers.readthedocs.io/en/latest/, still can't figure out what am i missing. Any help appreciated.