【问题标题】:Queryset working in regular django but getting KeyError when applying the queryset to a DRF Serializer?查询集在常规 django 中工作,但在将查询集应用于 DRF 序列化器时出现 KeyError?
【发布时间】:2020-12-29 09:30:45
【问题描述】:

我得到了以下查询集:

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", )

有什么大惊小怪的?

【问题讨论】:

  • 您的查询集不包含.cost,因为.values(..) 只会传递monthtotal_cost。换句话说,您的 ExpenseSerializer 被构造为序列化 Expense 对象,而不是其他值的字典。

标签: django django-rest-framework django-queryset django-serializer


【解决方案1】:

您的ExpenseSerializer 被构造为序列化Expense 对象或包含ExpenseSerializer 需要的所有必要字段的字典。

但是,您的查询集仅传递两个值:monthtotal_cost。因此,您不应通过ExpenseSerializer 将其包装起来,而应使用自定义包装,例如:

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

【讨论】:

  • 嗯 - 我不关注 - 那么这个 ExpenseSummarySerializer 将如何连接到 Expense 对象呢?编辑:啊哈,然后我就像serializer = ExpenseSummarySerializer(queryset, many=True) 一样传递它?我看到了
  • @erikvm:是的。因为您的查询集不会生成 Expense 对象,所以它会生成 dictionaries
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 2017-07-09
  • 2014-12-19
  • 2017-11-02
  • 1970-01-01
  • 2017-06-24
  • 2013-09-26
相关资源
最近更新 更多