根据带有 id 和分数的其他列表对 Django 查询集进行排序
Posted
技术标签:
【中文标题】根据带有 id 和分数的其他列表对 Django 查询集进行排序【英文标题】:Ordering a Django queryset based on other list with ids and scores 【发布时间】:2018-01-23 09:48:57 【问题描述】:我对某件事有点心烦意乱,乍一看似乎很简单。
我正在获取要选择的 ids
和 scores
的列表,以根据它们对它们进行排序。
我目前的解决方案如下:
ids = [1, 2, 3, 4, 5]
items = Item.objects.filter(pk__in=ids)
现在我需要以某种方式添加基于分数的排序,因此我将构建以下列表:
scores = [
'id': 1, 'score': 15,
'id': 2, 'score': 7,
'id': 3, 'score': 17,
'id': 4, 'score': 11,
'id': 5, 'score': 9,
]
ids = [score['id'] for score in scores]
items = Item.objects.filter(pk__in=ids)
到目前为止一切都很好 - 但我实际上如何将分数添加为某种聚合并根据它们对查询集进行排序?
【问题讨论】:
【参考方案1】:对分数列表进行排序,并使用in_bulk()
获取查询集。
scores = [
'id': 1, 'score': 15,
'id': 2, 'score': 7,
'id': 3, 'score': 17,
'id': 4, 'score': 11,
'id': 5, 'score': 9,
]
sorted_scores = sorted(scores) # use reverse=True for descending order
ids = [score['id'] for score in scores]
items = Item.objects.in_bulk(ids)
然后按您想要的顺序生成项目列表:
items_in_order = [items[x] for x in ids]
【讨论】:
谢谢!非常感激!我放弃使用in_bulk
,因为我有一个我没有提到的 select_related以上是关于根据带有 id 和分数的其他列表对 Django 查询集进行排序的主要内容,如果未能解决你的问题,请参考以下文章