私は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})
私は最適化するために、どんなアドバイスを求めています私のアプリ、ありがとう!
どのような組み合わせコードですか? – ahmed
@ahmed itertoolsモジュールの関数です。 https://docs.python.org/2/library/itertools.html#itertools.combinations – vadimb