Python 检索根据redis排序集排序的Django查询集的最有效方法
我有一个redis排序集,其中包含对象ID及其各自的排序分数。我需要检索这些对象的Django查询集,根据排序集的分数进行排序。最有效的方法是什么?我的数据库是postgresqlPython 检索根据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排序集和未排序查询集。接下来,我根据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 ]