Метод APIView возвращает объект не JSON сериализуемый - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь получить список пользователей, относящихся к определенной роли. Я использую метод APIView get() для обработки запросов get. До сих пор я создал класс ListUser (APIView) , как показано ниже.

class ListUsers(APIView):

    def get(self, request, formate=None):

        admin_users = User.objects.all()

        serilized_data = AdminSerializer(admin_users, many=True)

        return Response(serilized_data)

Когда я печатаю admin_users, он возвращал строковое представление таких объектов -

<QuerySet [<User: User Object (26)>, <User: User Object (27)>, <User: User Object (28)>, <User: User Object (29)>, <User: User Object (31)>]>

и когда я отправляю этот список, чтобы получить AdminSerializer, он возвращает -

Internal Server Error: /users/list/users/
Traceback (most recent call last):
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 145, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 143, in _get_response
    response = response.render()
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/rest_framework/renderers.py", line 103, in render
    allow_nan=not self.strict, separators=separators
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/rest_framework/utils/json.py", line 25, in dumps
    return json.dumps(*args, **kwargs)
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/rest_framework/utils/encoders.py", line 67, in default
    return super().default(obj)
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ListSerializer is not JSON serializable

У меня есть собственный класс менеджера для этой модели одним способом create_user(). Я использую тот же сериализатор (AdminSerializer()) для пользователей create и get.

Я хочу, чтобы метод get() взял query_param и применил его как фильтр, подобный этому -

admin_list = User.objects.all().filter(role = query_param.get('role')).values('first_name', 'last_name', 'email', 'phone_number')

Так выглядит мой сериализатор -

class AdminSerializer(serializers.Serializer):

    id = serializers.IntegerField(read_only=True)
    email = serializers.EmailField(required=True)
    first_name = serializers.CharField(max_length=255, required=True)
    last_name = serializers.CharField(max_length=255, required=True)
    phone_number = serializers.IntegerField(required=True)
    password  = serializers.CharField(max_length=255, required=True, write_only=True)
    role = serializers.IntegerField(required=True)
    is_active = serializers.BooleanField(required=False)

Я хочу -

{
"first_name":"",
"last_name":"",
"email":""
}

Где я ошибаюсь? что мне здесь не хватает?

...