根据带有 id 和分数的其他列表对 Django 查询集进行排序

Posted

技术标签:

【中文标题】根据带有 id 和分数的其他列表对 Django 查询集进行排序【英文标题】:Ordering a Django queryset based on other list with ids and scores 【发布时间】:2018-01-23 09:48:57 【问题描述】:

我对某件事有点心烦意乱,乍一看似乎很简单。

我正在获取要选择的 idsscores 的列表,以根据它们对它们进行排序。

我目前的解决方案如下:

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 查询集进行排序的主要内容,如果未能解决你的问题,请参考以下文章

你如何使用带有参数列表的 django-filter 包?

根据组和分数计算用户的排名

Django 左外连接

带有 Tailwind CSS 的 Django-Tinymce

如何根据Django中相同模型的其他字段ID过滤字段值

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项