Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Queryset在常规django中工作,但在将Queryset应用于DRF序列化程序时出现KeyError错误?_Django_Django Rest Framework_Django Queryset_Django Serializer - Fatal编程技术网

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)