我是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)