首页 > 解决方案 > AttributeError:Serializer DateField 将值转换为字节

问题描述

我有以下序列化程序:

class MySerializer(Serializer):
    my_date = DateField(read_only=True)

    class Meta:
         fields = [
             'my_date',
         ]

这是我的观点:

class InvoiceViewSet(GenericViewSet):
    """
    A generic ViewSet for viewing and editing the inquiries. This view gets the union of Invoices and Credit Notes

    """
    serializer_class = MySerializer
    filterset_class = MyFilter
    pagination_class = StandardResultsSetPagination

    def list(self, request, *args, **kwargs):       
       object_list = self.get_queryset()
       filter_queryset = self.filter_queryset(object_list)  # Apply filters
       paginated_queryset = self.paginate_queryset(filter_queryset)  # Apply pagination
       serializer = self.get_serializer(paginated_queryset, many=True)

       return self.get_paginated_response(serializer.data)

我在视图的最后一行收到以下错误:

AttributeError:“字节”对象没有属性“isoformat”

当我调试代码时,我看到该my_date字段在某些时候被转换为类型byte并且不再是日期。

当对象加载到序列化程序中时,显然会发生这种情况。当我使用 django ORM 查询对象时,该字段具有正确的类型。

任何想法为什么会发生这种情况以及我该如何解决?

Stacktrace,根据要求:

Traceback (most recent call last):   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\viewsets.py", line 116, in view
    return self.dispatch(request, *args, **kwargs)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\views.py", line 495, in dispatch
    response = self.handle_exception(exc)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\views.py", line 466, in raise_uncaught_exception
    raise exc   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)   File "C:\workspace\project\backend\project\invoicing\api\views.py", line 157, in list
    return self.get_paginated_response(serializer.data)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\serializers.py", line 768, in data
    ret = super(ListSerializer, self).data   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
    self.child.to_representation(item) for item in iterable   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\serializers.py", line 686, in <listcomp>
    self.child.to_representation(item) for item in iterable   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\serializers.py", line 530, in to_representation
    ret[field.field_name] = field.to_representation(attribute)   File "C:\Users\ronny\.virtualenvs\project-vDixCJD0\lib\site-packages\rest_framework\fields.py", line 1304, in to_representation
    return value.isoformat() AttributeError: 'bytes' object has no attribute 'isoformat'

最好的

罗恩

PS:我在 DRF v3.9.3

标签: django-rest-framework

解决方案


似乎这只是 DRF 中的一个错误......在序列化程序中加载对象时, 的值serializers.DateField被强制转换为byte.

这是我的快速修复:

from rest_framework.fields import DateField


class CustomDateField(DateField):

    def to_representation(self, value):
        # It seems that DRF has a bug and casts values of serializers.DateField() to byte instead of something useful.
        if isinstance(value, bytes):
            value = value.decode("utf-8")
        return super().to_representation(value)

推荐阅读