在django分组并订购

时间:2015-07-30 11:50:30

标签: django django-models django-views django-queryset

我想在模型 QFData 上执行分组 order_by 我正在尝试以下查询,但它无法正常工作。

查询1:

data = QFData.objects.filter(Branch_Code__in=branchcode, FldNo__gte=201, FldNo__lte=216) \
             .values('FldNo').aggregate(amt=Sum('Amount')) \
             .order_by('FldNo')

但是,如果我想订购,那么它可能会起作用。 查询2:

data = QFData.objects.filter(Branch_Code__in=branchcode, FldNo__gte=201, FldNo__lte=216) \
             .values('FldNo').aggregate(amt=Sum('Amount')) \
             .order_by(amt)

请帮忙解决这个问题。我想查询号码。 1正在工作

3 个答案:

答案 0 :(得分:1)

aggregate(...)方法返回一个dict而不是一个查询集,根据文档: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.aggregate

因此明显的解决方法是在order_by电话前移动aggregate来电:

data = QFData.objects \
           .filter(Branch_Code__in=branchcode, FldNo__gte=201, FldNo__lte=216) \
           .values('FldNo') \
           .order_by('FldNo') \
           .aggregate(amt=Sum('Amount'))

答案 1 :(得分:0)

根据Django QuerySet API reference

  

返回聚合值的字典(平均值,总和等)   通过QuerySet计算。 aggregate()的每个参数都指定一个   将包含在返回的字典中的值。

aggregate会根据文档返回一个字典,并且您尝试在字典上应用.order_by

order_by适用于查询集。我猜主要问题就在那里。

答案 2 :(得分:0)

我不太确定您希望从查询中得到什么。您是否考虑过使用注释而不是聚合?有关更多详细信息,请参阅annotate and values上的django文档,但我认为您可能希望运行(未经测试)的行 -

data = QFData.objects.filter(Branch_Code__in=branchcode,
    FldNo__gte=201, FldNo__lte=216) \
    .values('FldNo').annotate(amt=Sum('Amount')) \
    .order_by('FldNo')

这应该为您提供QuerySet而不是字典。

如果您确定需要聚合,可以使用OrderedDict直接使用直接python对字典进行排序。

请参阅以下示例(source) -

# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

您的情况可能是(未经测试):

data = OrderedDict(sorted(data.items()))