我正在尝试创建一个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
有没有办法让查询以与列表相同的顺序返回记录?
如果没有办法将查询结果重新排序为所需的顺序?
答案 0 :(得分:1)
注意:添加此作为答案,因为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')