繁体   English   中英

Django模型格式集性能

[英]Django model formset performance

对于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分配数据会导致服务器冻结单个对象的时间很长(很少是几个小时)。

经过短暂的挖掘,我个人归咎于模型表单集,因为当我创建它并像处理单个表单一样对其进行处理时,一切都会按预期进行。 但是我不知道如何解决/逃避这个问题。

感谢您的合理建议。

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

您需要找出ModelFormSet的queryset。 例如

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

该文档包含ModelFormSet的queryset的ModelFormSethttps : ModelFormSet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM