Django rest API:如何正确地序列化数据



我是django rest框架的新手。我得到的响应数据不是我需要的格式。任何帮助都将不胜感激。下面是我的代码。

型号.py

class Price(models.Model):
ticker = models.CharField(max_length=15, null=False, blank=False) 
price_date=models.DateField(null=False, blank=False)
daily_pe = models.FloatField(blank=True, null=True)

class Meta:
db_table= 'price'
unique_together = ('ticker', 'price_date')
def __str__(self):
return "%s %s %s " % (self.ticker, self.price_date, daily_pe)

serializers.py

class ChartSerilizer(serializers.ModelSerializer):
class Meta:
model = Price
fields = ['ticker', 'daily_pe']

view.py

class peChartViewSet(APIView):
def get(self, request):
queryset = Price.objects.all()
serializer = ChartSerilizer(queryset, many=True)
return JsonResponse(serializer.data, safe=False)

这就是我获得响应的方式:

[
{
"ticker": "AAPL",
"daily_pe": 25.144920802584345
},
{
"ticker": "AAPL",
"daily_pe": 25.043920960028977
},
{
"ticker": "WMT",
"daily_pe": 24.930801136366966
},
{
"ticker": "WMT",
"daily_pe": 25.504480242081453
},
]

但我需要这样的回应:

[
{
"Ticker": "AAPL",
"daily_pe": [25.144920802584345, 25.043920960028977]
},
{
"Ticker": "WMT",
"daily_pe": [24.930801136366966,25.504480242081453]
}
]

您可以使用ArrayAgg聚合函数来做您想要的事情

views.py

from django.contrib.postgres.aggregates import ArrayAgg
class peChartViewSet(APIView):
def get(self, request):
queryset = Price.objects.values('ticker').annotate(
daily_pe_list=ArrayAgg('daily_pe')
)
serializer = ChartSerilizer(queryset, many=True)
return JsonResponse(serializer.data, safe=False)

并将daily_pe的类型更改为ListField
serializers.py

class ChartSerilizer(serializers.ModelSerializer):
Ticker = serializers.CharField(source='ticker')
daily_pe = serializers.ListField(source='daily_pe_list')
class Meta:
model = Price
fields = ['Ticker', 'daily_pe']

根据您的答案,您希望结果列表按price_date的顺序排列,因此为此,您可以向ArrayAgg添加ordering参数,如下所示:

queryset = Price.objects.values('ticker').annotate(
daily_pe_list=ArrayAgg('daily_pe', ordering='price_date')
)

*对不起,我接晚了,我不在电脑旁。

肯定有更好的方法,但我(几乎(得到了想要的结果。这是我的最新视图.py

class peChartViewSet(APIView):
def get(self, request):
tickers = ['AAPL', 'WMT']
data=[]

for tick in tickers:
print(tick)
# tick = request.query_params["ticker"]    
queryset = Price.objects.all().filter(ticker=tick).order_by('price_date')
serializer = ChartSerilizer(queryset, many=True)
data.append({tick : serializer.data})

return Response(data)

最新更新