如何在Django休息框架中进行分组和计数

时间:2017-04-17 14:08:46

标签: python django django-rest-framework

我正在使用

Django==1.10.6
djangorestframework==3.6.2

到目前为止我已经尝试了但是我收到了关键错误

views.py

from django.db.models import Func, F, Sum, Count
from django.db.models.functions import TruncMonth

class SalesReportViewSet(viewsets.ModelViewSet):
    queryset = imodels.Sales.objects.all()
    serializer_class = iserializers.SalesReportSerializer

    def get_queryset(self):
        data = imodels.Sales.objects.annotate(month=TruncMonth('date')).values('month').annotate(c=Count('id')).values('month', 'c')
        return data

models.py

class Sales(models.Model):

    orig_quantity = 0

    product = models.ForeignKey(Product)
    sold_to = models.ForeignKey(Merchant)
    quantity = models.PositiveIntegerField()
    desc = models.CharField(max_length=255)
    date = models.DateTimeField()
    created_at = models.DateTimeField(default=datetime.now)

serializers.py

class SalesReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Sales
        #fields = ['id', 'quantity', 'total']
        fields = '__all__'
  

错误我在/ sales-report /获得KeyError时出现了KeyError   尝试在序列化程序上获取字段quantity的值   SalesReportSerializer。\ n序列化程序字段可能已命名   错误且不匹配dict上的任何属性或键   实例。\ n原始异常文本是:'数量'。

1 个答案:

答案 0 :(得分:0)

您的查询集错误。它现在甚至不是查询集:

data = (imodels.Sales.objects
        .annotate(month=TruncMonth('date'))
        .values('month')
        .annotate(c=Count('id'))
        .values('month', 'c')  # After this call you will receive list of dicts
                               # [{"month": ..., 'c': ...}, ...]

因此,您的方法'get_queryset'的结果是一个没有字段quantity的字典。 Serializer会错误地告诉你。

尝试添加序列化程序所需的所有值以进行values调用。