gpt4 book ai didi

mysql - Django 查询自然排序

转载 作者:行者123 更新时间:2023-11-29 00:06:01 28 4
gpt4 key购买 nike

假设我有这个 Django 模型:

class Question(models.Model):
question_code = models.CharField(max_length=10)

数据库中有 15000 个问题。

我想按 question_code 排序,它是字母数字。这是一个非常经典的问题,已经在以下内容中讨论过:

我尝试了第二个链接中的代码(复制在下面,稍作更改),并注意到对数据进行排序最多需要 3 秒。为了确保函数的性能,我编写了一个测试,它创建了一个包含 100k 个随机字母数字字符串的列表。对该列表进行排序仅需 0.76 秒。那么发生了什么?

这是我的想法。该函数需要获取每个问题的question_code进行比较,因此调用此函数对15k个值进行排序意味着分别请求mysql 15k次。这就是为什么需要这么长时间的原因。任何想法?一般来说,Django 的自然排序有什么解决方案吗?非常感谢!

def natural_sort(l, ascending, key=lambda s:s):
def get_alphanum_key_func(key):
convert = lambda text: int(text) if text.isdigit() else text
return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))]
sort_key = get_alphanum_key_func(key)
return sorted(l, key=sort_key, reverse=ascending)

最佳答案

据我所知,没有通用的 Django 解决方案。您可以通过构建 id/question_code 查找结构来减少内存使用并限制数据库查询

from natsort import natsorted
question_code_lookup = Question.objects.values('id','question_code')
ordered_question_codes = natsorted(question_code_lookup, key=lambda i: i['question_code'])

假设您想要对结果进行分页,然后您可以将 ordered_question_codes 切片,执行另一个查询以检索您需要的所有问题,并根据它们在该切片中的位置排序

#get the first 20 questions
ordered_question_codes = ordered_question_codes[:20]
question_ids = [q['id'] for q in ordered_question_codes]
questions = Question.objects.filter(id__in=question_ids)
#put them back into question code order
id_to_pos = dict(zip((question_ids), range(len(question_ids))))
questions = sorted(questions, key = lambda x: id_to_pos[x.id])

如果查找结构仍然使用太多内存,或者排序时间太长,那么您将不得不想出更高级的方法。这当然不能很好地扩展到庞大的数据集

关于mysql - Django 查询自然排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com