#python #django #django-views #django-serializer
Вопрос:
У меня есть сериализатор a от core.сериализаторы в моем представлении 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)
Ответ №1:
Ваши операторы печати мало помогают, потому что наборы запросов ленивы. Это означает, что они оцениваются не во время фильтрации qs = Institution.objects.filter(name__contains=cd['name'])
, а, скорее, когда используется фактическое значение.
Так что я не особо вдаюсь в сериализацию, для этого есть действительно хорошие способы, и Django сам по себе уже предоставляет хорошие инструменты. Посмотрите на набор запросов и производительность базы данных, это самая важная тема, откуда, как я подозреваю, у вас проблемы с производительностью. Также проведите больше исследований по select_related и prefetch_related, это поможет вам сократить более 200 запросов до 2
Вы можете использовать панель инструментов отладки django в своей локальной среде, чтобы легко отслеживать свое приложение. Но есть и другие инструменты профилирования и советы.