查询集在常规 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
需要的所有必需字段的字典。
然而,您的查询集仅传递两个值:month
和 total_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)
我得到了以下查询集:
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
需要的所有必需字段的字典。
然而,您的查询集仅传递两个值:month
和 total_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)