Python 使用django和sqlite的运行时问题-查询太多

Python 使用django和sqlite的运行时问题-查询太多,python,mysql,django,python-2.7,sqlite,Python,Mysql,Django,Python 2.7,Sqlite,我遇到以下代码的运行时问题: # filter start and end date matches = database.objects.filter(start__gte= Start, end__lte= End) # iterate through matches for Item in matches: # filter database again test = database.objects.filter(cm1=Item.cm1, cm2

我遇到以下代码的运行时问题:

# filter start and end date
matches = database.objects.filter(start__gte= Start, end__lte= End)    
# iterate through matches
for Item in matches:
        # filter database again
        test = database.objects.filter(cm1=Item.cm1, cm2=Item.cm2, cm3=Item.cm3)
        # compare first item of filter with iterated Item
        if test[0] == Item:
            TrueRun = True
        else:
            TrueRun = False
我有一个大约8万行的数据库。在第一步中,我过滤我想要查看的行,通常应该在8k左右。在第二步中,我对所有这些项目进行迭代,检查它们是否唯一,或者是第一个具有某些特定属性的项目(
cm1
cm2
cm3

现在的问题是,我需要进行8k数据库查询,总共需要15分钟。是否有任何方法可以加速这一过程,例如在循环之前使用dict,它包含所有可能的
cm1
及其“匹配行”

谢谢你的帮助

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

评论后编辑

我的模型的默认顺序与此处的使用方式不同。在程序中,我有大约25个模型,并检查其中12个是否相等

循环的其余部分应该不有趣,因为之前有另一种方法可以检查
TrueRun
,大约需要2分钟。唯一改变的是内部——请看这里:

equalnessList = ['cm1','cm2', 'cm3']
for idx, Item in enumerate(matches):
    #-----------------#
    TrueRun = True
    listTrue = []
    for TrueIdx,TrueItem in enumerate(listTrue):
        EqualCount = 0
        for equCrit in equalnessList:
            if getattr(Item,equCrit)!=getattr(matches[TrueItem],equCrit):
                EqualCount += 1
        if EqualCount == len(equalnessList):
            TrueRun = False
            break
    #------------------#
    # Some stuff in here, that can't be changed
    if TrueRun:
        resDict[getattr(Item,'id')] = [True]
        listTrue.append(idx)
    else:
        resDict[getattr(Item,'id')] = [False]

这里的问题是,它工作不正常,没有使用筛选日期之外的数据库条目进行检查。

您可能需要调整它以满足您的要求。特别是,您需要在每个
cm1、cm2、cm3
组内保持原始排序顺序

# filter start and end date
matches = database.objects.filter(start__gte=Start, end__lte=End)

# iterate through matches
for item in matches:
    # filter database again and get the id of the first element matched
    first_item = database.objects.filter(cm1=item.cm1, cm2=item.cm2, cm3=item.cm3).values('id').first()
    # compare first item id with the id of filtered "item"
    if first_item['id'] == item.id:
        TrueRun = True
    else:
        TrueRun = False
matches = database.objects.filter(start__gte=Start, end__lte=End)
all_objects = database.objects.all().order_by('cm1', 'cm2', 'cm3', 'sequence')
# replace 'sequence' by field(s) that model is sorted on by default
results_dict = {}
cm1 = None
cm2 = None
cm3 = None
first = False
for obj in all_objects:
    if (obj.cm1 != cm1) or (obj.cm2 != cm2) or (obj.cm3 != cm3):
        cm1 = obj.cm1
        cm2 = obj.cm2
        cm3 = obj.cm3
        first = True
    if obj.start >= Start and obj.end <= End:
        results_dict[obj.id] = first
    first = False
matches=database.objects.filter(start\u gte=start,end\u lte=end)
all_objects=database.objects.all().order_by('cm1','cm2','cm3','sequence'))
#将“序列”替换为默认情况下模型排序的字段
结果_dict={}
cm1=无
cm2=无
cm3=无
第一个=错误
对于所有_对象中的obj:
如果(obj.cm1!=cm1)或(obj.cm2!=cm2)或(obj.cm3!=cm3):
cm1=obj.cm1
cm2=obj.cm2
cm3=obj.cm3
第一个=正确

如果obj.start>=开始和obj.end谢谢,但是有没有不改变“匹配项”的方法?我需要它在原来的方式为一些其他东西在循环..不知道,更新了我的答案!然而,可能有更好的解决方案,这取决于您的模型结构和您的逻辑(在视图中)是什么……模型结构如何产生影响?因为您可能(也可能不)声明了模型之间不必要的关系。此外,根据视图的逻辑,通过较少的查询(避免
for
循环)可能(也可能不会)实现相同的目标。模型类似于:
cm2=Models.CharField(db_column='cm2',max_length=30)
模型的默认顺序是什么,能否显示循环的其余部分?您如何使用
TrueRun
?更新了您评论中的问题。