【问题标题】:Django model formset performanceDjango 模型表单集性能
【发布时间】:2016-04-21 06:25:29
【问题描述】:

我对 Django 1.4.2 和 PostgreSQL 9.1 几乎没有性能问题。我想用这样的形式创建模型:

forms.py

class AcknowledgeForm(forms.ModelForm):

    class Meta:
        model = Attendance
        fields = ['acknowledge', ]
        widgets = {'acknowledge': forms.CheckboxInput()}


AcknowledgeFormset = forms.models.modelformset_factory(Attendance, form=AcknowledgeForm, extra=0)

对于具有少量外键的模型

models.py

class Attendance(models.Model): #500k rows in DB
    zamestnani = models.ForeignKey('people.Zamestnani',  related_name='attendance') #~1k rows
    day = models.ForeignKey(Day) #~2.5k rows
    acknowledge = models.NullBooleanField(blank=True, null=True)

views.py

class VacationAcknowledgeView(LoginRequiredMixin, TemplateView):
    template_name = "presence/presence_vacation_acknowledge.html"
    http_method_names = ['get', 'post']

    def get_context_data(self, **kwargs):
        context = super(VacationAcknowledgeView, self).get_context_data()
        person = Person.fromRequest(self.request)
        first_day = date(date.today().year, 1, 1)
        days = Attendance.objects.filter(acknowledge=None,  day__date__gte=first_day, zamestnani__osoba=person)
        context['formset'] = AcknowledgeFormset(queryset=days)
        return context

    def post(self, request, *args, **kwargs):
        #next line is screwed
        formset = AcknowledgeFormset(request.POST)
        #never been there....
        return super(VacationAcknowledgeView, self).get(request, *args, **kwargs)

我可以创建它,渲染它,一切看起来都还不错,但是从 POST 分配数据会导致服务器冻结单个对象的非常长的时间(几乎是几个小时)。

经过短暂的挖掘后,我个人责怪模型表单集,因为当我创建它并像单个表单一样处理它时,一切都按预期工作。但我不知道如何解决/避免这个问题。

感谢任何合理的建议。

【问题讨论】:

    标签: django performance django-forms modelform formset


    【解决方案1】:

    您提到您的数据库中有大约 500,000 行用于 Attendance 模型。在 Django 中,当没有为 ModelFormSet 指定 queryset 参数时,它包括该模型中的所有对象。 Django 可能正在获取所有 500,000 行数据。

    您需要找出ModelFormSet 的查询集。例如

    def post(self, request, *args, **kwargs):
        queryset = Attendance.objects.none()
        formset = AcknowledgeFormset(queryset=queryset, data=request.POST)
        # continue with your regular code execution
    

    文档包含ModelFormSet 的查询集部分:https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#django.forms.models.BaseModelFormSet

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2018-11-23
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多