有一个 Django 序列化器 return 两个平面列表

Having a Django serializer return two flat lists

使用这样的序列化程序...

class MyPriceSerializer(serializers.Serializer):
    prices = serializers.SerializerMethodField()

    def get_prices(self, obj):
        return obj.prices.values_list('price', flat=True)

class ChartData(RetrieveAPIView):
    queryset = Market.objects.all()
    authentication_classes = []
    permission_classes = []
    serializer_class = MyPriceSerializer

...我可以在另一端拿起这样的平面列表:

{
    "prices": [
        0.52,
        0.55,
        ...
        0.94,
        0.93
    ]
}

如果我将序列化器更改为 return obj.prices.values_list('price_date', flat=True),我可以得到:

{
    "prices": [
        "2019-07-22T15:19:02.924811Z",
        "2019-07-22T15:19:02.924811Z",
        ...
        "2019-07-22T15:58:41.337422Z",
        "2019-07-22T16:04:16.753870Z"
    ]
}

但是是否可以在一个序列化器中同时获得两者(如下所示),以便我可以在模板中的一次 Ajax 调用中获取结果?

{
    "prices": [
        0.52,
        0.55,
        ...
        0.94,
        0.93
    ]

    "price_dates": [
        "2019-07-22T15:19:02.924811Z",
        "2019-07-22T15:19:02.924811Z",
        ...
        "2019-07-22T15:58:41.337422Z",
        "2019-07-22T16:04:16.753870Z"
    ]
}

您可以再添加一个 SerializerMethodField:

class MyPriceSerializer(serializers.Serializer):
    prices = serializers.SerializerMethodField()
    price_dates = serializers.SerializerMethodField()

    def get_prices(self, obj):
        return obj.prices.values_list('price', flat=True)

    def get_price_dates(self, obj):
        return obj.prices.values_list('price_date', flat=True)

如果您将 prefetch_related 添加到查询集中,这允许您从 prices 添加任意数量的字段,而无需额外的 sql 查询:

class ChartData(RetrieveAPIView):
    queryset = Market.objects.all().prefetch_related('prices')
    authentication_classes = []
    permission_classes = []
    serializer_class = MyPriceSerializer