如何按外部值对 Django QuerySet 进行排序?

2024-05-06

我有一个由(id,rank)对组成的字典。我想对 ids 执行 Django 查询,以便生成的查询集按排名(降序)排序。

获取查询集很容易:

rankings = {...}
result = MyModel.objects.filter(id__in=rankings.keys())

看起来答案应该涉及某种注释,我可以将其用作 order_by 的一部分,但我不知道如何到达那里。

编辑:我忘记提到我需要结果是一个 QuerySet,因为这是 tastypie API 管道的一部分。


我的 Django > 1.10 和 PostgreSQL > 9.5 解决方案

from django.db.models import Func, Value, IntegerField, CharField
from django.contrib.postgres.fields import ArrayField


class ArrayPosition(Func):
    function = 'array_position'

    def __init__(self, items, *expressions, **extra):
        if isinstance(items[0], int):
            base_field = IntegerField()
        else:
            base_field = CharField(max_length=max(len(i) for i in items))
        first_arg = Value(list(items), output_field=ArrayField(base_field))
        expressions = (first_arg, ) + expressions
        super().__init__(*expressions, **extra)


pk_list = [234,12,23]
queryset = SomeModel.objects.filter(pk__in=pk_list, ...)\
    .annotate(ordering=ArrayPosition(pk_list, F('pk'), output_field=IntegerField()))\
    .order_by('ordering')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按外部值对 Django QuerySet 进行排序? 的相关文章

随机推荐