如何在Django QuerySet中按计数排序?

3
我尝试使用这个查询,但结果并不如预期。
ships = Shipment.objects.filter(added_on__gte=("2016-10-22")).annotate(sku_count=Count('sku')).order_by('sku_count')

如果我没错的话,您想按'sku'列进行分组,并按其计数排序,是吗? - Vikram Singh Chandel
2个回答

4
如果您想按“sku”列分组并按其计数排序,这可以帮助您。
# Ascending order
ships = Shipment.objects.filter(added_on__gte=("2016-10-22")).values("sku").annotate(sku_count=Count('sku')).order_by('sku_count')

# Descending order
ships = Shipment.objects.filter(added_on__gte=("2016-10-22")).values("sku").annotate(sku_count=Count('sku')).order_by('-sku_count')

In [3]: ships = Shipment.objects.filter(added_on__gte("2016-10-22")).values("sku").annotate(sku_count=Count('sku')).order_by('sku_count')In [5]: ships[0] Out[5]: {'sku': u'bedcll_5rsdeal', 'sku_count': 1}我需要Shipment类的对象,而不是ships[0] = {'sku': u'bedcll_5rsdeal', 'sku_count': 1},这样我才能进行进一步的操作。 - Tejas Gaykar
@TejasGaykar 在这里,我们正在按sku字段进行分组,因此我们得到了摘要视图。如果您想要具有像“bedcll_5rsdeal”这样的值的Shipment类数组,则必须像这样迭代ships列表: for ship in ships: obj=Shipment.objects.filter(sku=ship['sku']) #your code - Vikram Singh Chandel

3

你在评论中说你想要这个对象。你应该能够这样做:

ships = Shipment.objects.filter(added_on__gte("2016-10-22")).annotate(sku_‌​count=Count('sku')).‌​order_by('sku_count'‌​)

唯一的问题是对于相同的sku,您将会拥有重复的行。请记住,当您使用“group by”时,您正在通过它们共同的一个值(sku)对多个值(Shipment实例)进行聚合。

所以像Vikram上面所说的那样,您可以像这样获取唯一sku和它们的计数:

Shipment.objects.filter(added_on__gte("2016-10-22")).values(‌​"sku").annotate(sku_‌​count=Count('sku')).‌​order_by('sku_count'‌​)

但是为了获取特定的运输实例,您需要在该点按“sku”获取运输实例。希望这有所帮助。


ships=Shipment.objects.filter(added_on__gte=("2016-10-22")).annotate(sku_count =Count('sku')).order_by('sku_count') I Tried this, it ran without error but it does not sort by sku countsI iterated the shipments in for loop as follows for ship in ships: print ship.skuand the output came is as follows BKS_100616_5MCD samsung_LED599 BKS_2809_RBKwtch BKS_100616_5MCD samsung_LED599 samsung_LED599 BKS_100616_5MCD BKS_2809_RBKwtch samsung_LED599 - Tejas Gaykar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接