Queryset在常规django中工作,但在将Queryset应用于DRF序列化程序时出现KeyError错误?
我得到了以下查询集:Queryset在常规django中工作,但在将Queryset应用于DRF序列化程序时出现KeyError错误?,django,django-rest-framework,django-queryset,django-serializer,Django,Django Rest Framework,Django Queryset,Django Serializer,我得到了以下查询集: queryset = Expense.objects .annotate(month=TruncMonth('expense_date')) .values('month') .annotate(total_cost=Sum('cost')) .values('month', 'total_cost') .order_by("month") 基本上,它将所有费用汇总,并按月进行分组。如果我只是打印查询集,它就可以正常工作: <QuerySet [
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.py
:
class ExpenseSerializer(serializers.ModelSerializer):
class Meta:
model = Expense
exclude = ("receipt", )
有什么麻烦吗?您的
ExpenseSerializer
被构造为序列化费用
对象,或包含ExpenseSerializer
所需的所有必要字段的字典
但是,您的查询集只传递两个值:month
和total\u cost
。因此,您不应该通过ExpenseSerializer
来包装它,例如,您可以使用如下定制的序列化程序:
class ExpenseSummarySerializer(serializers.Serializer):
month = serializers.DateField()
total_cost = serializers.DecimalField(max_digits=9, decimal_places=2)
class ExpenseSummarySerializer(serializers.Serializer):
month=serializers.DateField()
total_cost=序列化程序。DecimalField(最大数字=9,小数点=2)
您的查询集不包含。cost
,因为。值(…)
只会经过月和total_cost
。换句话说,您的ExpenseSerializer
被构造为序列化Expense
对象,而不是其他值的字典。嗯-我不明白-这个ExpenseSummarySerializer
将如何连接到Expense对象?编辑:啊哈,然后我只需像serializer=expensesumaryserializer(queryset,many=True)
那样传递它?我see@erikvm:是的。因为查询集不生成费用
对象,所以它生成字典。
class ExpenseSerializer(serializers.ModelSerializer):
class Meta:
model = Expense
exclude = ("receipt", )
class ExpenseSummarySerializer(serializers.Serializer):
month = serializers.DateField()
total_cost = serializers.DecimalField(max_digits=9, decimal_places=2)