Django形成效率问题

时间:2013-06-18 19:09:56

标签: django post formset

我继承了一些由多个开发人员处理的代码,因此,该产品没有标准。我有重大的性能问题,并且正在修复它们中的很多,但不知道如何打破这个问题。当用户在预先填充数据的页面上提交,并允许用户选择活动的日期时,他们可以提交,并且具有日期的任何内容都会消失。问题出在views.py中。当用户提交时,以下代码将运行,并在formset = formset(request.POST)处挂起。我假设有多个db调用正在发生,但是当我打印到终端时没有看到它们。以下是整个提交过程。

STATES = ['Routed','Reconciled']

formset = None

form = StudyOnlyForm()

study_pk = request.GET.get('study', '0')
if study_pk == '' or study_pk == '0':
    study_pk = 0

# child transactions that are 'Recoginzed',
# reportable with a 'Routed' parent
qs = Transaction.objects.filter(contract__reportable=True,
        cleared = False,
        contract__study__pk=study_pk,
        transaction_status='Recognized',
        parent_transaction__isnull=False,
        parent_transaction__transaction_status__in=STATES)

#Designed to capture standalone contracts
qs1 = Transaction.objects.filter(contract__reportable=True,
        cleared = False,
        contract__study__pk=study_pk,
        contract__contract_type__name='Standalone',
        transaction_status__in=STATES)

#Captures Arms contracts for Milestone payments
parent_list = []
arms_list = []

parent = Transaction.objects.filter(parent_transaction__isnull=True,
    contract__reportable=True,
    cleared = False,
    contract__study__pk=study_pk,
    contract__contract_type__name='ARMs',
    transaction_status__in=STATES)

children = Transaction.objects.filter(contract__reportable=True,
        cleared = False,
        contract__study__pk=study_pk,
        transaction_status='Recognized',
        contract__contract_type__name='ARMs',
        parent_transaction__isnull=False,
        parent_transaction__transaction_status__in=STATES)

for child_item in children:
    parent_list.append(child_item.parent_transaction.pk)
    arms_list.append(child_item.pk)

for parent_item in parent:
    if parent_item.pk not in parent_list:
        arms_list.append(parent_item.pk)

qs3 = Transaction.objects.filter(pk__in=arms_list)

qs4 = qs | qs1 | qs3

qs = qs4.order_by('-pk')

formset = modelformset_factory(Transaction, form=PaidDateForm, extra=0, can_delete=False)

if request.method == "POST":
    print 'if request.POST'
    print datetime.datetime.now()
    formset = formset(request.POST)
    print 'created formset'
    print datetime.datetime.now()
    if formset.is_valid():
        print 'formset valid'
        print datetime.datetime.now()
        updated_transactions = formset.save(commit=False)
        print 'updated transactions'
        print datetime.datetime.now()
        for trans in updated_transactions:
            if trans.paid_amount is not None and trans.date_cleared is not None:
                trans_to_change = Transaction.objects.get(pk=trans.pk)
                trans_to_change.paid_amount = trans.paid_amount
                trans_to_change.date_cleared = trans.date_cleared
                trans_to_change.paid_currency = trans_to_change.entered_currency
                trans_to_change.paid_amount_usd = 
                Decimal(str(trans_to_change.paid_amount * Decimal(str(trans_to_change.exchange_rate)).quantize(Decimal('0.01')))).quantize(Decimal('0.01'))
                trans_to_change.edited_by = request.user
                trans_to_change.cleared = True
                trans_to_change.save()
        if updated_transactions:
            messages.add_message(request, messages.INFO, 'The transactions have been updated successfully.')
            return HttpResponseRedirect(reverse('track:update_pdate'))
        else:
            messages.add_message(request, messages.INFO, 'No transactions have been updated.')

            return render_to_response(
                'track/paid_date_update.html',
                {'formset':formset,
                 'form': form,
                 'study_pk':study_pk,
                },
                context_instance=template.RequestContext(request))

else:
    formset = formset(queryset=qs)

return render_to_response(
        'track/paid_date_update.html',
        {'formset':formset,
         'form': form,
         'study_pk':study_pk,
        },
        context_instance=template.RequestContext(request))


Forms:

class StudyOnlyForm(forms.Form):
    action = forms.CharField(widget=forms.HiddenInput())
    #
    # JBL - Q4.0 changed this form to pull all studies (previously
    #       only 'active' studies), which really means all studies
    #       that are not 'ccc' studies
    #
    study = forms.ModelChoiceField(required=False,
            label='Protocol',
            queryset=Study.objects.all().exclude(study_status='ccc'))

    def __init__(self, *args, **kwargs):
        self.req = True
        if 'req' in kwargs:
            self.req = kwargs.pop('req')
        super(StudyOnlyForm, self).__init__(*args, **kwargs)
        print 'StudyOnlyForm() init'
        self.fields['study'].required = self.req

class PaidDateForm(forms.ModelForm):
    formfield_callback = jquery_datefield
    paid_amount = forms.DecimalField(label="Cleared
    Amount",max_digits=14,decimal_places=2,required=False)
    date_cleared = forms.DateField(label="Cleared Date",widget=JQueryDateWidget(),
    input_formats=settings.DATE_INPUT_FORMATS, required=False)

    class Meta:
        model = Transaction
        include = ('date_time_created')

    def __init__(self, *args, **kwargs):
        super(PaidDateForm, self).__init__(*args, **kwargs)
        print 'PaidDateForm init'
        for field in self.fields:
            if field != 'date_cleared':
                self.fields[field].widget = forms.HiddenInput()
        self.fields['paid_amount'].widget.attrs['size'] = 12
        self.initial['paid_amount'] = '%.2f' % (self.instance.usd_amount)

2 个答案:

答案 0 :(得分:1)

您限制GET分支中的查询集,但不限制POST分支。这意味着POST分支创建一个包含每个事务的表单集。

答案 1 :(得分:0)

替换你的for循环:

for trans in updated_transactions.exclude(paid_amount=None, date_cleared=None).all():
    trans_to_change = Transaction.objects.get(pk=trans.pk)
    trans_to_change.paid_amount = trans.paid_amount
    trans_to_change.date_cleared = trans.date_cleared
    trans_to_change.paid_currency = trans_to_change.entered_currency
    trans_to_change.paid_amount_usd = Decimal(str(trans_to_change.paid_amount * Decimal(str(trans_to_change.exchange_rate)).quantize(Decimal('0.01')))).quantize(Decimal('0.01'))
    trans_to_change.edited_by = request.user
    trans_to_change.cleared = True
    trans_to_change.save()