Есть ли способ улучшить производительность модели словаря данных в 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