我有一个简短的视图,但是有一个复杂的查询(使用的模型来自数据库MySQL视图)。问题是当这个视图执行时,模板加载太慢。Django调试工具显示查询被复制了1367次,但是重复的查询与复杂的数据库视图查询无关。在
下面是我的模板和视图代码。很抱歉没有把它们展示得太好,但这是我在StackOverflow上的第一篇文章。在
def simbouloi_list(request, eklid):
paramorder = request.GET.get('orderoption', '')
try:
paramorder = int(paramorder)
except:
paramorder = 6 # default ταξινόμηση
selected_ekloges = Eklogestbl.objects.filter(eklid=eklid)
# επιλογή όλων των εκλ. αναμετρήσεων με visible=1 και κάνω φθίνουσα ταξινόμηση αν δεν δοθεί παράμετρος
all_ekloges = Eklogestbl.objects.filter(visible=1).order_by('-eklid')
#all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('surname', 'firstname', 'fathername')
if paramorder==1 or paramorder==6:
all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('surname', 'firstname','fathername')
elif paramorder == 2:
all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('sindiasmos', 'surname', 'firstname','fathername')
elif paramorder == 3:
all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('sindiasmos', 'toposeklogis', 'surname', 'firstname','fathername')
elif paramorder == 4:
all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by( 'toposeklogis','sindiasmos','surname', 'firstname','fathername')
else:
all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('toposeklogis', 'surname','firstname', 'fathername')
context = {'all_ekloges': all_ekloges,
'selected_ekloges': selected_ekloges,
'all_simbouloi': all_simbouloi,
}
return render(request, 'Elections/simbouloi_list.html' , context)
模板:
^{pr2}$
我不认为我可以使用以下命令:
selected_ekloges = all_ekloges.objects.prefetch_related('eklallsimbvw_set').get(eklid=eklid) all_simbouloi = selected_ekloges.eklallsimbvw_set.all()
因为“eklallsimbvw”是由“inspect_db”命令自动创建的模型,它描述的是Mysql视图而不是表,所以这个模型没有与“Eklogestbl”模型相关的外键(我对“prefetch”命令的理解)。在
对于第一个命令,它还会引发一个错误,如“QuerySet”object没有属性“objects”。在
这是我的EklallsimbVw型号:
这是“Eklogestbl”模型:
^{pr2}$试试这个,这是django querysets求值的一个很好的起点https://docs.djangoproject.com/en/2.1/ref/models/querysets/
更新
最后下面的代码工作完美!在
选定的日志=Eklogestbl.objects.prefetch_相关('eklallsimbvw_set').get(eklailsimbvw_集)).get(eklid=eklid)
^{pr2}$非常感谢你!在
相关问题 更多 >
编程相关推荐