Django'da yeni durumdayım ve POST istemcisi MultipleChoiceField istek süresiyle ilgili sorunlarım var. Kişilerin listesi var ve bu kişilerin yaşadıkları zamanla yaşadıkları adres listesini görüntülemek istiyorum, ama çözümüm çok yavaş.Django işleme MultipleChoiceField verileri çok uzun sürüyor
3 + kişiyi seçersem, yükleme süresi çok büyük olur (4-5 saniye), ancak db sorguları yalnızca 0,5-0,7 saniye sürer (django-debug-toolbar diyor ki), bu yüzden hiç oluşturmadım dizinler henüz (bunları oluşturacağım). Sanırım uzun sayfa yüklemesi problemi yanlış görüş çalışmalarım hakkında. Ayrıca django-debug-toolbar 'Zamanlayıcı' panelinde çoğu zaman "Request" bölümü alır.
benim models.py aitbasitleştirilmiş versiyonu:
class Person(models.Model):
name = models.CharField(max_length=300)
class House(models.Model):
name = models.CharField(max_length=300)
persons = DictField() # stores {person_id: time_lived} - persons, who lived here
forms.py:
class PersonListForm(forms.Form):
persons= forms.MultipleChoiceField(choices=
((person['id'], person['name'].lower()) for person in sorted(
Person.objects.all().values('id', 'name'), key=itemgetter('name'))),
label='Choice person list:'
)
views.py:
class ChoicePersonView(FormView):
template_name = 'guess_houses.html'
form_class = PersonListForm
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
persons_id = form.cleaned_data['persons']
houses = [] # list of houses i want to display
t1 = time()
comb = [] # I need all houses, where lived any of these persons
for r in range(1, len(persons_id)+1):
comb += [i for i in combinations(persons_id ,r)]
for id_person_dict in House.objects.all().values('id', 'persons', 'name'):
for c in comb:
if set(c).issubset(set(id_person_dict['persons'])):
if id_person_dict not in houses:
houses.append(id_person_dict)
return render(request, self.template_name, {'form': form, 'houses': houses, 't': time() - t1})
Ben herhangi bir tavsiye için soruyorum optimize etmek benim uygulamam, teşekkür ederim!
"Kombinasyonlar" kodu nedir? – ahmed
@ahmed bu itertools modülünden bir işlev. https://docs.python.org/2/library/itertools.html#itertools.combinations – vadimb