Django重数据库查询与数据处理

2024-10-06 09:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数可以跨多个对象执行大量数据库查询:

def some_func(user):
    group1 = user.manytomanyfield1.all()
    allinstances = []
    for item in group1:
        allinstances += group1.manytomanyfield2.all()

然后我有一个列表“allinstances”,它是由对象组成的。然后,我需要检查创建的“allinstances”列表中是否有具有“name”属性的对象,该属性在“allinstances”列表中的某些数量的对象中是相同的,并删除重复项:

^{pr2}$

当allinstances的大小很小时,函数执行得非常快。但是我的应用程序范围是这样的,它通常可以处理数万到几十万个'object1'的数量,所以'allinstances'列表会很大,所以函数的执行需要很长一段时间。目前在'allinstances'中有~25000'object1,函数执行需要10秒。这对我来说是无法承受的,因为返回的列表进一步放入Paginator中,并且包含object1详细信息的Listview是根据结果构造的,因此用户必须等待函数执行。在

我认为有以下几种方法可以减少这一瓶颈: 1优化函数执行速度 2更改我的视图以使用AJAX,并将函数执行重新路由到类似celeri的异步任务队列。然后页面上的AJAX以一定的时间间隔查询结果,当任务完成时,将结果添加到页面上。在

在这种情况下有什么最佳做法吗? 也许还有其他更可行的解决方案? 欢迎提出任何代码改进建议。在


Tags: 对象函数数据库列表数量属性defajax
2条回答

我认为很多性能问题都是由于Django在拥有大量记录时不得不运行大约25000个查询造成的。在

prefetch_related是我在这里使用的。在

代码的第一部分如下所示:

def some_func(user):
    group1 = user.manytomanyfield1.all().prefetch_related('manytomanyfield2')
    allinstances = []
    for item in group1:
         allinstances += item.manytomanyfield2.all()

一个非常快速的优化是使names成为一个集合,因为列表查找是线性的(O(n)),而集合查找是常量(O(1)):

names = set()
doubleList = []
for number, object1 in enumerate(allinstances):
    if object1.name not in names:
        names.add(object1.name)

相关问题 更多 >