0

私はDjangoで新しく、MultipleChoiceFieldのPOST要求時間が長いことに問題がありました。それは人のリストを持っていて、私はそこに住んでいた時間と共に住んでいたが、私の解決策は遅すぎる住所のリストを表示したい。Django処理MultipleChoiceFieldデータが長すぎます

私が3人以上の時間を選択した場合、負荷時間は非常に大きくなります(4-5秒)が、dbクエリは0.5-0.7秒しかかかりません(django-debug-toolbarのように)。インデックスはまだ(私はそれらを作成します)。私は長いページの負荷の問題は私の間違ったビューの仕事についてだと思う。また、django-debug-toolbarの 'Timer'パネルでは、ほとんどの時間が "Request"セクションになります。

私のmodels.pyの簡略化されたバージョン:

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}) 

私は最適化するために、どんなアドバイスを求めています私のアプリ、ありがとう!

+0

どのような組み合わせコードですか? – ahmed

+0

@ahmed itertoolsモジュールの関数です。 https://docs.python.org/2/library/itertools.html#itertools.combinations – vadimb

答えて

0

まず、sqlを使用してソートしてから、代わりにcssを使用して行うことができます。

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

あなたは人や家の模型を投稿することができ、フォームの保存部分について

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

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

なり?

+0

インデックスはありませんが、db-sortは少し時間を追加しました。私は既にmodels.pyを投稿しました。あなたはpost.pyを投稿するのですか? – vadimb

関連する問題