2012-10-14 67 views
0

我在我的一个视图中有以下代码。问题是我无法弄清楚如何将它重构为一个for循环。唯一的区别是'项目'。部分。我需要在同一个模板中的所有三个变量值,所以我不认为我可以从urls.py传递信息。任何想法,我可以重写这个,所以我不重复自己?重构此视图代码

谢谢。

def average(request): 

    cal_list = [] 
    cal_list2 = [] 
    cal_list3 = [] 

    exams = Test.objects.filter(test__test_name__iexact="one") 
    for item in exams: 
     cal_list.append(int(item.start)) 
     result = sum(cal_list)/float(165) * 100 
     result = result/len(cal_list) 
     result = int(round(result)) 
     result = str(result) + '%' 

    for item in exams: 
     cal_list2.append(int(item.s1)) 
     result2 = sum(cal_list2)/float(165) * 100 
     result2 = result2/len(cal_list2) 
     result2 = int(round(result2)) 
     result2 = str(result2) + '%' 

    for item in exams: 
     cal_list3.append(int(item.s2)) 
     result3 = sum(cal_list3)/float(165) * 100 
     result3 = result3/len(cal_list3) 
     result3 = int(round(result3)) 
     result3 = str(result3) + '%' 

    return direct_to_template(request, 'a.html', {'result': result, 'result2': result2, 'result3': result3}) 

回答

1

我只想创造一个功能:

def calculate_result(items): 
    items = tuple(int(i) for i in items) 
    result = sum(items)/16500.0 
    result = result/len(items) 
    return '%i' % round(result) + '%' 

result0 = calculate_result(item.start for item in exams) 
result1 = calculate_result(item.s1 for item in exams) 
result2 = calculate_result(item.s2 for item in exams) 
+0

Thanks @Nathan。我的工作很好,我应该能够重复使用这个概念进行类似的计算。 –

+0

不客气。 :) –

0

你去那里的简单重构,从只有所需的东西迭代和移动计算圈外的保存循环。

def average(request): 

    cal_list = [] 
    cal_list2 = [] 
    cal_list3 = [] 

    exams = Test.objects.filter(test__test_name__iexact="one") 
    for item in exams: 
     cal_list.append(int(item.start)) 
     cal_list2.append(int(item.s1)) 
     cal_list3.append(int(item.s2)) 

    result = sum(cal_list)/float(165) * 100 
    result = result/len(cal_list) 
    result = int(round(result)) 
    result = str(result) + '%' 

    result2 = sum(cal_list2)/float(165) * 100 
    result2 = result2/len(cal_list2) 
    result2 = int(round(result2)) 
    result2 = str(result2) + '%' 

    result3 = sum(cal_list3)/float(165) * 100 
    result3 = result3/len(cal_list3) 
    result3 = int(round(result3)) 
    result3 = str(result3) + '%' 

    return direct_to_template(request, 'a.html', {'result': result, 'result2': result2, 'result3': result3}) 
1

在你的循环,你一直覆盖results值,这样你就可以推断出部分:

for item in items: 
    cal_list.append(int(item.start)) 
    cal_list2.append(int(item.s1)) 
    cal_list3.append(int(item.s2)) 

result = "%s%%" % round((sum(cal_list)/float(165) * 100)/len(cal_list)) 
result2 = "%s%%" % round((sum(cal_list2)/float(165) * 100)/len(cal_list2)) 
result3 = "%s%%" % round((sum(cal_list3)/float(165) * 100)/len(cal_list3)) 
0

可以使用aggregate在数据库层执行总和。

from django.db import models 

def average(request): 
    queryset = Test.objects.filter(test__test_name__iexact="one") 
    total = queryset.count() 
    results = queryset.aggregate(
     result1=models.Sum('start'), 
     result2=models.Sum('s1'), 
     result3=models.Sum('s2')) 
    def transform(resultsum): 
     result = resultsum/float(165) * 100 
     result = result/total 
     result = int(round(result)) 
     result = str(result) + '%' 
     return result 
    result1 = transform(results['result1']) 
    result2 = transform(results['result2']) 
    result3 = transform(results['result3']) 
    return direct_to_template(request, 'a.html', {'result': result1, 'result2': result2, 'result3': result3})