我首先创建了一个包含此字典的词典列表:
navs = [{'dim': object_1, 'values': [list_of_objects_relates_to_Obj1]}]
我有一个这样的入门模型:
class Entry(models.Model):
resp_id = models.ForeignKey('Responsibilities')
resp_value = models.ForeignKey('JlmValues')
比计算导航列表中每个对象的相关元素的循环:
for i in navs:
for j in i['values']:
total = 0
list_retrieved = Entry.filter(Q(resp_value__value_path = j.value_id) | Q(resp_value__value_path__endswith= '.' + j.value_id) | Q(resp_value__value_path__contains= '.' + j.value_id + '.') | Q(resp_value__value_path__startswith= j.value_id + '.')).values_list('resp_id__mgtper_id').distinct()
s = datetime.now()
total += len(Responsibilities.filter(mgtper_id_id__in=list_retrieved))
counter.append({'type':'value','value':j.value_name, 'total':total})
e = datetime.now()
print "Execution time of calculating total : "+str(e - s)
每个元素的平均时间:
Execution time of calculating total : 0:00:00.928000
我在导航中有6个词典,一个词典中的一些对象有300多个相关对象。有没有办法最小化时间执行?
答案 0 :(得分:0)
这是一种可以改进它的方法。如果您未在其他地方使用此查询的结果:
total += len(Responsibilities.filter(mgtper_id_id__in=list_retrieved))
使用.count()
方法而不是使用len
更有效。 E.g:
total += Responsibilities.filter(mgtper_id_id__in=list_retrieved).count()
这样,它们的计数将在数据库上执行,而不是在Django实例上执行。