та знаю что не прикольно. ДУмаю вот как обойти это. Уж очень оно как-то медленно строит словари..
точнее список словарей.
кароч, вот вьюха:
def shots_by_project(request, project):
if project:
try:
p = Project.objects.only('id', 'name', 'slug').get(slug=project)
s = Shot.objects.select_related().filter(project = p, hide = False, ommited=False)
except Project.DoesNotExist:
return HttpResponse('[{"error":"Project not found"}]', mimetype='application/json; charset=utf8')
mdict = []
for y, shot in enumerate(s):
s_dict = {
'id':shot.id,
'name':shot.name,
'project':p.__unicode__(),
'priority':shot.get_priority_display(),
'sequence':{
'name':shot.sequence.name,
'id':shot.sequence.pk,
},
'team':{
'name':getattr(shot.team, 'name', ''), #тут так, ибо бывает NoneType
'id':getattr(shot.team, 'pk', '')
},
'status':{
"id":shot.status.pk,
"name":shot.status.name,
"color":shot.status.color
},
"status_dpx":{
"id":getattr(shot.status_dpx, 'pk', ''),
"name":getattr(shot.status_dpx, 'name', '')
},
"pic":shot.pic,
"start_date":shot.start_date,
"end_date":shot.end_date,
"bid_days":shot.bid_days,
"frames":shot.frames,
"desc":shot.desc,
"comments":0, #как тут видно, это еще даже не все запросы
"dailies":0,
"ommited":shot.ommited
}
c_dict = {}
for i, c in enumerate(shot.colorcode.all()): #тут
c_dict.update({i:{'name':str(c.name),'color':str(c.color),'id':c.pk} })
s_dict.update({'colorcode':c_dict})
t_dict = {}
for x, t in enumerate(shot.task_set.all()): #и тут - самые тяжелые места. если закоментить, то ускоряемся раза в 3
t_dict.update({
x:{
'type':str(t.task_type).lower(),
'status':str(t.status).lower()
}
});
s_dict.update({'progress':t_dict})
mdict = mdict + [s_dict]
html = json.dumps(mdict, indent=4 * ' ')
return HttpResponse(html, mimetype='application/json; charset=utf8')
return HttpResponseForbidden('[{"error":"Forbidden"}]', mimetype='application/json; charset=utf8')