Django处理MultipleChoiceField数据的时间太长



我是Django的新手,遇到了MultipleChoiceField POST请求时间过长的问题。它有人员列表,我想显示地址列表,这些人员居住的地方和他们居住的时间,但我的解决方案太慢了。

因此,如果我选择3个以上的人,加载时间会变得非常长(4-5秒),但数据库查询只需要0.5-0.7秒(正如django调试工具栏所说),这就是为什么我还没有创建任何索引(我会创建它们)。我认为长页面加载的问题是因为我的工作视图错误。此外,在django调试工具栏的"计时器"面板中,大多数时间都在"请求"部分。

我的模型的简化版本.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})

我正在寻求任何优化我的应用程序的建议,谢谢!

首先可以使用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;
}

对于表格保存部分,你能发布人和房子的模型吗?

最新更新