使用特定顺序的ID列表从Django数据库获取记录

5

我想创建一个Django查询集,按照特定顺序返回与ID列表匹配的记录。

我的ID列表如下:

[34,12,4,89,3,67,11]

如果我运行以下查询:
queryset = Item.objects.filter(pk__in=[34,12,4,89,3,67,11])

该查询按照ID顺序返回记录:

3,4,11,12,34,67,89

有没有办法让查询返回的记录与列表中的顺序相同?
如果不能,是否有一种方法可以将查询结果重新排序为所需的顺序?

你所确定的排序(34、12、4、...)是否与模型上的某个属性有关? - Taylor D. Edmiston
这里有一个可能相关的问题 - https://dev59.com/U3NA5IYBdhLWcg3wpfiu,不过我认为如果没有像将queryset强制转换成像列表等对象,然后使用自定义lambda进行手动排序,你所寻找的东西是不可能实现的。 - Taylor D. Edmiston
不,id列表与模型无关。 - Bill Noble
在不了解更多您的使用情况的情况下,另一个考虑因素可能是将此自定义订单作为模型上的(唯一的)int字段添加。其中一个优点是将数据与代码分离(例如,可以在Django ORM中进行更改)。 - Taylor D. Edmiston
如何将自定义订单添加为唯一字段?这样做会有什么效果? - Bill Noble
我会将这个作为答案添加,因为评论不支持代码块。 - Taylor D. Edmiston
1个回答

2
注意:我将此作为答案添加,因为在原问题的评论中OP提到了这种方法。在评论中显示片段不允许使用抽象代码块。
在原问题的评论中,我提到了一种替代方案,即将您的订单号存储在模型字段中,以便有序查询更简单。
其中一个用例是,如果您有一个对象队列,其中每个项目都是电影,并且用户正在决定观看它们的顺序。您可能希望允许Django管理员或用户重新排列项目(因此将其变为字段)。出于简单示例的目的,假设只有一个用户,因此我们将排序置于模型中,而不是通过Item和User模型进行自定义表连接。
该模型:
class Item(models.Model):
    # ...
    my_order = models.PositiveIntegerField(unique=True)

在创建时或稍后设置属性:

Item.objects.create(id=34, my_order=1)
Item.objects.create(id=12, my_order=2)
Item.objects.create(id=4, my_order=3)
# ...

当然,您可以按任何顺序创建它们并设置my_order,结果仍将保持不变。

按照所需的顺序检索对象:

queryset = Item.objects.order_by('my_order')

如果我想按照预先指定的顺序返回项目,那个解决方案还可以。但是每次进行搜索时,我的ID列表都会发生变化,所以这种方法就不适用了。 - Bill Noble

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