简体   繁体   English

Django Rest Framework:如何序列化列表列表?

[英]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)

Taken from DRF docs 取自DRF文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM