Есть ли способ улучшить производительность модели словаря данных в Dict Appraoch?

В настоящее время я получаю кучу записей для наборов форм в моем приложении Django с помощью следующего метода...

    line_items = BudgetLineItem.objects.filter(budget_pk=dropdown)

    line_item_listofdicts = []
    for line_item in line_items:
        line_item_dict = model_to_dict(line_item)
        del line_item_dict['id']
        del line_item_dict['budget']
        del line_item_dict['archive_budget']
        del line_item_dict['new_budget']
        del line_item_dict['update_budget']
        line_item_listofdicts.append(line_item_dict)

    UpdateBudgetLineItemFormSet = inlineformset_factory(UpdateBudget,
                                                        UpdateBudgetLineItem,
                                                        form=UpdateBudgetLineItemForm,
                                                        extra=len(line_item_listofdicts),
                                                        can_delete=True,
                                                        can_order=True)

Хорошая новость заключается в том, что он работает и делает то, что я хочу. Однако он очень медленный. Требуется около 13 секунд, чтобы вернуть данные в мое приложение. Не оптимально. Я провел утро, пытаясь сделать различные prefetches и select_relateds, но ничего не помогло улучшить время, необходимое для вывода этих полей на экран. Поля, о которых идет речь, в основном DecimalFields, и я читал, что они могут быть немного медленнее. Я пытаюсь использовать эти данные в качестве "ввода" для моих наборов форм в CreateView. И снова это работает... но медленно. Есть идеи, как сделать этот подход более производительным?

Заранее спасибо за любые мысли.

Вместо того, чтобы получать модели и удалять ненужные вам поля, вы можете просто запросить модели, указав только список нужных вам полей используя метод queryset values(*args), в котором вы указываете нужные вам поля как str(s)

И он автоматически вернет его в виде словаря со списком и указанными полями. #взяв ваш код для примера, я предполагаю, что вам нужны только title и added_date из вашей модели

Примечание: если предположить, что ваша модель BudgetLineItem имеет поля title и added_date, то ваш код может иметь вид

line_items = BudgetLineItem.objects.filter(budget_pk=dropdown).values('title', 'added_on') 

   
    UpdateBudgetLineItemFormSet = inlineformset_factory(UpdateBudget,
                                                        UpdateBudgetLineItem,
                                                        form=UpdateBudgetLineItemForm,
                                                        extra=line_items.count(),
                                                        can_delete=True,
                                                        can_order=True)

Из вашего кода вы выполняете операции, которые вам не нужны

Поскольку это просто len элементов, вам не нужно оценивать запрос, вы можете просто вызвать count метод queryset

Если в каком-то фрагменте кода все еще нужно использовать вашу переменную line_item_listofdicts, то вы можете просто заменить ее на line_items, поскольку это список словарей, содержащий только нужные вам поля, вместо того, чтобы преобразовывать ваш модельный кверисет в список экземпляров модели, удалять ненужные вам поля и снова преобразовывать его в другой список (эти операции очень дороги)

Вы можете ознакомиться с документом value

Вернуться на верх