让 Django 序列化程序返回两个平面列表

Posted

技术标签:

【中文标题】让 Django 序列化程序返回两个平面列表【英文标题】:Having a Django serializer return two flat lists 【发布时间】:2019-11-30 16:22:33 【问题描述】:

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

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"
    ]

【问题讨论】:

【参考方案1】:

你可以再添加一个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

【讨论】:

顺便问一下,有没有一种简单的方法可以将get_price_dates 返回的字符串从(例如)"2019-07-22T15:58:41.337422Z" 截断为"2019-07-22 15:58" @kh_one 看看这个答案***.com/a/48503805/641249 谢谢!我在 Postgres 上,所以这最终工作了:***.com/a/18749861/5674156

以上是关于让 Django 序列化程序返回两个平面列表的主要内容,如果未能解决你的问题,请参考以下文章

Django 序列化返回一个空列表

django rest 框架模型序列化器 - 读取嵌套,写入平面

如何在 django 的一个序列化程序中拥有两个模型

我正在尝试将相关表的数据放入 Django Rest Framework 中的列表序列化程序中

如何从 django 中的两个不同表中返回数据?

Django:在模型 save() 方法中返回序列化程序 ValidationError