我想在模型 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正在工作
答案 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()))