0

私はDjangoが初めてで、MultipleChoiceFieldのPOSTリクエスト時間が長いという問題がありました。人のリストがあり、住所のリストを表示したいのですが、これらの人がそこに住んでいた時間とともに住んでいましたが、私の解決策は遅すぎます。

したがって、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

フォーム.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:'
)

ビュー.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})

アプリを最適化するためのアドバイスを求めています。ありがとうございます!

4

1 に答える 1