Почему мой django core.serializers такой медленный
У меня есть мой сериализатор из core.serializers в моем представлении django. Он работает, но иногда требуется более 1 минуты, чтобы показать таблицу результатов. Есть идеи, как сделать это быстрее?
# views.py
from django.core import serializers
def search_institution(request):
form = SearchInstitutionsForm()
qs = Institution.objects.all()
if request.method == "POST":
form = SearchInstitutionsForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
if cd['name']:
qs = Institution.objects.filter(name__contains=cd['name'])
print(f"Before requesting from db: {datetime.now()}")
print(f"After requesting from db, before serializing: {datetime.now()}")
context = {
"result_data": SafeString(serializers.serialize("json", qs)),
'form': form
}
print(f"After serializing, before rendering: {datetime.now()}")
return render(request, "landing/result_table.html", context)
else:
context = {
"form": SearchInstitutionsForm
}
return render(request, "stakeholders/institution_form.html", context)
Ваши операторы печати не сильно помогают, потому что Querysets являются ленивыми. Это означает, что они оцениваются не во время фильтрации qs = Institution.objects.filter(name__contains=cd['name'])
, а когда используется фактическое значение.
Так что я не буду сильно углубляться в сериализацию, есть действительно хорошие способы сделать это, и Django сам по себе уже предоставляет хорошие инструменты. Изучите Queryset и производительность базы данных, это самая важная тема, откуда, как я подозреваю, исходит ваша проблема производительности. Также изучите select_related и prefetch_related, это поможет вам сократить 200+ запросов до 2
Вы можете использовать панель инструментов django Debug toolbar в локальной среде, чтобы легко контролировать ваше приложение. Но есть и другие инструменты профилирования и советы.