查询集在常规 django 中工作,但在将查询集应用于 DRF 序列化程序时出现 KeyError?

Queryset working in regular django but getting KeyError when applying the queryset to a DRF Serializer?

我得到了以下查询集:

queryset = Expense.objects
.annotate(month=TruncMonth('expense_date'))
.values('month')
.annotate(total_cost=Sum('cost'))
.values('month', 'total_cost')
.order_by("month")

这基本上是将所有费用成本相加并按月分组。如果我只是打印出查询集,它就可以正常工作:

<QuerySet [{'month': datetime.date(2020, 9, 1), 'total_cost': Decimal('1029772.00')}]>

但是,如果我尝试序列化它:

serializer = ExpenseSerializer(queryset, many=True)

我明白了

Got KeyError when attempting to get a value for field `cost` on serializer `ExpenseSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'cost'."

serializer.py:

class ExpenseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense
        exclude = ("receipt", )

有什么大惊小怪的?

您的 ExpenseSerializer 用于序列化 Expense 对象或包含您 ExpenseSerializer 需要的所有必需字段的字典。

然而,您的查询集仅传递两个值:monthtotal_cost。因此你不应该用 ExpenseSerializer 包装它,但是例如像这样的自定义包装:

class ExpenseSummarySerializer(serializers.<b>Serializer</b>):
    <b>month</b> = serializers.DateField()
    <b>total_cost</b> = serializers.DecimalField(max_digits=9, decimal_places=2)