有一个 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
使用这样的序列化程序...
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