让 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 rest 框架模型序列化器 - 读取嵌套,写入平面