django-rest-framework - 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
解决方案
似乎这只是 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)
推荐阅读
- excel - 即使我关闭了显示警报,workbook.close 也会提示“想要保存”对话框
- python - 第一次猜测,即使我做对了,也没有任何东西被注册
- python - Python FuzzyWuzzy 比率:它是如何工作的?
- php - 如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server
- javascript - 如何将参数从纯javascript文件发送到html文件
- github - 你怎么能得到一个用户今天用 GitHub API 做了多少贡献?
- node.js - 当我使用 where 时,Firestore 不会检索我的数据
- html - 用于静态内容的 S3 与 DynamoDB
- asp.net-core - 如何在控制器外部发送消息?
- c - 打印由 PE(64 位)导入的 DLL