0

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 ait

basitleş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!

+0

"Kombinasyonlar" kodu nedir? – ahmed

+0

@ahmed bu itertools modülünden bir işlev. https://docs.python.org/2/library/itertools.html#itertools.combinations – vadimb

cevap

0

İlk önce sql kullanarak sıralama yapabilirsiniz ve daha sonra kasa için bunun yerine css ile yapabilirsiniz.

((person['id'], person['name'].lower()) for person in sorted(
     Person.objects.all().values('id', 'name'), key=itemgetter('name'))), 

Eğer Person ve House modelini gönderebilir kısmını tasarruf şekli için

forms.MultipleChoiceField(choices=Person.objects.order_by('name').values('id', 'name')) 

With CSS: 
.lowercase { 
    text-transform: lowercase; 
} 

OLUYOR?

+0

dizinim yokken, db-sort biraz zaman ekledi. models.py adresimi zaten gönderiyorum. forms.py mesajını mı kastediyorsun? – vadimb