[英]Django Rest Framework: How serialize list of list?
How to serialize list of list of Floats using Django Rest serializers? 如何使用Django Rest序列化程序序列化Floats列表?
My data is ( repr
of my list of object): 我的数据是(我的对象列表的
repr
):
[{
'id': '413',
'data': [
[None, 32.33125, None, None],
[None, 37.96, 48.70112359550562, 66.118],
[None, None, 58.06576923076923, 77.31023809523809],
[None, None, None, 110.0075],
[None, None, None, 139.89]
]
}, {
'id': '406',
'data': [
[None, 35.33125, None, None],
[None, 37.96, 43.123, 66.118],
[None, None, 58.12, 72,123],
[None, None, None, 119.000234],
[None, None, None, 139.89]
]
}]
For users trying to propose different approach, I need to explain that I need serializer class because I want to use generics.ListAPIView
and I need to setup serializer_class
property. 对于试图提出不同方法的用户,我需要解释一下我需要序列化程序类,因为我想使用
generics.ListAPIView
并且需要设置serializer_class
属性。
You must create Field
class that will work with Null
values: 您必须创建将使用
Null
值的Field
类:
class FixedFloatField(serializers.FloatField):
def to_internal_value(self, data):
if data is None:
return data
return super().to_internal_value(data)
def to_representation(self, value):
if value is None:
return value
return super().to_representation(value)
(because standard one throws TypeError: float() argument must be a string or a number, not 'NoneType'
) (因为标准的会引发
TypeError: float() argument must be a string or a number, not 'NoneType'
)
Now use this Serializer (the trick is to use ListField
): 现在使用此序列化器(技巧是使用
ListField
):
class SearchResultSerializer(serializers.Serializer):
id = serializers.IntegerField()
data = serializers.ListField(
child=serializers.ListField(
child=FixedFloatField(
allow_null=True,
required=False,
default=None
)
)
)
You can use the biult-in json
module. 您可以使用biult-in
json
模块。
data = [{
'id': '413',
'data': [
[None, 32.33125, None, None],
[None, 37.96, 48.70112359550562, 66.118],
[None, None, 58.06576923076923, 77.31023809523809],
[None, None, None, 110.0075],
[None, None, None, 139.89]
]
}, {
'id': '406',
'data': [
[None, 35.33125, None, None],
[None, 37.96, 43.123, 66.118],
[None, None, 58.12, 72,123],
[None, None, None, 119.000234],
[None, None, None, 139.89]
]
}]
import json
json_data = json.dumps(data)
You can mix this with a DRF view: 您可以将其与DRF视图混合使用:
from rest_framework.response import Response
...
json_data = json.dumps(data)
return Response(json_data)
EDIT 编辑
To use ListAPIView
使用
ListAPIView
assuming your data are coming from a model named Mymodel
假设您的数据来自名为
Mymodel
的模型
# Serializer
from rest_framework import serializers
class MymodelSerializer(serializers.ModelSerializer):
class Meta:
model = Mymodel
# View
from rest_framework import generics
class MymodelList(generics.ListAPIView):
queryset = Mymodel.objects.filter(whatever=whatever)
def list(self, request):
# Note the use of `get_queryset()` instead of `self.queryset`
queryset = self.get_queryset()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.