Python 检索根据redis排序集排序的Django查询集的最有效方法

Python 检索根据redis排序集排序的Django查询集的最有效方法,python,django,sorting,redis,Python,Django,Sorting,Redis,我有一个redis排序集,其中包含对象ID及其各自的排序分数。我需要检索这些对象的Django查询集,根据排序集的分数进行排序。最有效的方法是什么?我的数据库是postgresql 目前,我正在分别检索redis排序集和未排序查询集。接下来,我根据python中排序集的分数对查询集进行排序。这里是否可以有意义地削减步骤,例如在检索点对查询集进行排序等 obj_ids_with_scr = get_ids_w_scr() #retrieves redis sorted set with

我有一个redis排序集,其中包含对象ID及其各自的排序分数。我需要检索这些对象的Django查询集,根据排序集的分数进行排序。最有效的方法是什么?我的数据库是postgresql


目前,我正在分别检索redis排序集和未排序查询集。接下来,我根据python中排序集的分数对查询集进行排序。这里是否可以有意义地削减步骤,例如在检索点对查询集进行排序等

    obj_ids_with_scr = get_ids_w_scr() #retrieves redis sorted set with scores
    obj_ids = map(itemgetter(0),obj_ids_with_scr) # filters sorted set for just the obj ids
    queryset = Widget.objects.filter(id__in=obj_ids) #unsorted queryset
    a = dict(obj_ids_with_scr) #turning the sorted set into a dictionary
    for obj_pk, sort_score in a:
        obj = queryset.get(id=obj_pk) #get object with id equalling obj_pk 
        sort_score = obj  #assign the object to the 'score' value of this key-value 
    result = a.values() #making a list of all values, that are now in sorted order
    return result

如果您使用的是postgres,您可以模拟mysql的
orderbyfield
语法,通过定义您自己的语法:

然后打电话来:

queryset = queryset.extra(
    select={'manual': "FIELD(id, %s)" % (','.join(map(str, obj_ids)),) },
    order_by=['manual']
)

n、 b.如果您选择以下选项,也可以像这样优化python代码:

widgets = Widgets.objects.in_bulk(obj_ids)
sorted_widgets = [ widgets[x] for x in obj_ids if x in widgets ]

批量返回一个
dict
映射
id
Widget
实例,这对正在进行的排序类型很有用。您可以阅读更多信息。

您使用的是什么数据库?我使用的是postgresql 9.3谢谢。第一种方法非常独特——我将尝试一下。第二个更简单,但批量中的
是什么?它是否类似于
filter()
批量
类似于filter,您可以向它传递一个ID列表,它将检索带有这些ID的
小部件。它还特别之处在于,它返回一个映射
id
小部件的
dict
。这是Widgets.objects.filter(id\uu in=obj\u id)中x的缩写{code>{x.id:x代表x}
。老实说,我从未尝试过。但我认为只要在
批量
调用(例如
Widget.objects.select\u related('Widget\u parent')。批量(obj\u id)
猜只有一种方法可以找到,谢谢你的回答!
widgets = Widgets.objects.in_bulk(obj_ids)
sorted_widgets = [ widgets[x] for x in obj_ids if x in widgets ]