我最近正在用Django构建一个化合物数据库。我在处理模型遍历时遇到问题。以下是我的问题:
型号:
class CompoundStructures(models.Model):
molregno = models.CharField(max_length=27L, primary_key=True)
molfile = models.TextField(blank=True)
standard_inchi = models.TextField(blank=True)
standard_inchi_key = models.CharField(max_length=27L, unique=True)
canonical_smiles = models.TextField(blank=True)
molformula = models.CharField(max_length=100L, blank=True)
class Meta:
db_table = 'compound_structures'
def __unicode__(self):
return self.molformula
该模型的数据库中有1000000多条记录:我运行的代码是这样的:
all_mols = CompoundStructures.objects.all()
mol_0 = all_mols[0] //quick
mol_100 = all_mols[100] //normal
mol_10000 = all_mols[10000] //slow
mol_100000 = all_mols[100000] //really slow!
为什么随着索引号变大,它会变得更慢?这使我无法穿越CompoundStructures
。
进行时
mol_100000 = all_mols[100000]
Django从CompoundStructures.objects.all()
评估QuerySet
这总是很慢的,因为你拿到了所有的摩尔,现在想要第100000摩尔,这是合乎逻辑的。
如果你想从数百万行中提取一(1)mol,那么在使用数据库和Django的ORM时,.get(id=100000)
是你唯一的选择。
在这里使用.get()
并不比您现在尝试做的事情更昂贵,即获取所有内容,然后评估QuerySet。