我认为这没有多大意义。事实上,你按年份过滤:
queryset = Transactions.objects.filter(date__year=current_year)
因此,所有返回记录的年份都是相同的。
但是,您可以在这里使用以下命令自定义序列化程序:
class PartialChartSerializer(serializers.ModelSerializer):
month = serializers.IntegerSerializer()
profit = serializers.IntegerField()
class Meta:
model = Transactions
fields = ['month', 'profit']
class ProfitChartSerializer(serializers.Serializer):
year = serializers.IntegerField()
data = PartialChartSerializer(many=True)
并将项目馈送到序列化器,如下所示:
from itertools import groupby
from operator import itemgetter
@api_view(['GET'])
@permission_classes([IsAuthenticatedOrReadOnly])
def profit_chart(request):
queryset = (
Transactions.objects.values(
month=ExtractMonth('date'), year=ExtractYear('date')
)
.annotate(profit=Sum(F('sale_price')) - Sum(F('purchase_price')))
.order_by('month')
)
serializer = ProfitChartSerializer(
[
{'year': k, 'data': list(vs)}
for k, vs in groupby(queryset, itemgetter('year'))
],
many=True,
)
return Response(serializer.data, status=status.HTTP_200_OK)
注:
:通常给Django模型一个
singular
nameÂ
[django-antipatterns]
,所以
Transaction
而不是
Transactions
.