2013-06-18 7 views
0

Я унаследовал некоторый код, обработанный несколькими разработчиками, и поэтому нет стандарта для продукта. У меня серьезные проблемы с производительностью, и я исправляю многие из них, но не знаю, как это сломать. Когда пользователь отправляет на страницу, которая предварительно заполняет данные, и позволяет пользователю выбирать дату для активности, они могут отправлять, и что-то с датой уходит для них. Проблема находится в пределах views.py. Когда пользователь отправляет, выполняется следующий код и вешает трубку formset = formset(request.POST). Я предполагаю, что происходит несколько вызовов db, но я не вижу их, когда печатаю на терминал. Ниже приведен полный процесс подачи заявки.Проблема с эффективностью формы Django

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) 
+0

Покажите нам, откуда берется 'formet'. но я думаю, что проблема заключается в 'for trans in updated_transactions' loop. Возможно, есть много запросов – lalo

+0

Если возможно, определение 'Transaction' – lalo

ответ

0

заменить ваш цикл:

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() 
+0

Это хорошая идея, но я до сих пор не знаю, почему у меня есть 90-секундный промежуток времени, который происходит на 'formet = formset (request.POST)' – user2498453

+0

Итак, разбор запроса.POST в набор форм занимает много времени ... как выглядит форма/форма и модель? Чтобы увидеть SQL-запросы, вы можете добавить приложение django-debug-toolbar в свое приложение. Очень удобно. –

+0

Я добавил формы и остальную часть представления – user2498453

1

Вы ограничить QuerySet в GET ветви, но не филиал POST. Это означает, что ветка POST создает набор форм, содержащий каждую транзакцию.

+0

Вы имеете в виду каждую транзакцию на странице? В этом случае это не большая проблема. На каждой странице не более 10 транзакций. Я знаю, что я должен делать слишком много соединений db, но не знаю, как это сделать. – user2498453

+0

Нет, я имел в виду * каждую транзакцию в db. – Alasdair

+0

Я хотел бы знать, как я могу ограничивать сообщение только элементами в qs, если вы можете сделать предложение. – user2498453

Смежные вопросы