У меня на сайте есть раздел с офисами, на котором помимо информации об объектах, есть ещё и фильтрация.
Код из models.py: (Код не полный, но это не важно, там в районе 10 атрибутов)
class Offices2(models.Model):
city = models.CharField(max_length=255, choices=Choice_city, blank=True, verbose_name='Город')
address = models.CharField(max_length=255, blank=True, verbose_name='Адрес')
Мне нужно было добавить на страницу с офисами карту, на которой будут расположены объекты, для чего я использовал Folium и GeoCoder. До добавления карты, страница загружалась очень быстро, даже учитывая, что там была фильтрация и учитывая огромное кол-во объектов в БД.
Вот такой код во views.py был до добавления карты:
class OfficesPage(ListView):
model = Offices2
template_name = 'CatalogTenants/offices.html'
context_object_name = 'offices'
paginate_by = 10
allow_empty = True
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['FilterOffice'] = OfficesFilter(self.request.GET, queryset=Offices2.objects.all())
context['form'] = ClientsForm()
def post(self, request):
if request.method == 'POST':
form = ClientsForm(request.POST)
if form.is_valid():
form.save()
send_mail(subject=form.cleaned_data['FIO'],
message=form.cleaned_data['phone'],
from_email='pdlyadirekt@yandex.ru',
recipient_list=['solonkou4eba@mail.ru']
)
messages.success(request, 'Заявка отправлена')
return redirect('offices')
else:
messages.error(request, 'Форма заполнена неверно')
form = ClientsForm()
return redirect('offices')
def get_queryset(self):
queryset = super().get_queryset()
return OfficesFilter(self.request.GET, queryset=queryset).qs
Вот код из views.py после добавления карты.
class OfficesPage(ListView):
model = Offices2
template_name = 'CatalogTenants/offices.html'
context_object_name = 'offices'
paginate_by = 10
allow_empty = True
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['FilterOffice'] = OfficesFilter(self.request.GET, queryset=Offices2.objects.all())
context['form'] = ClientsForm()
# Создание карты и изначального её расположения карты #
m = folium.Map(location=[55.7887400, 49.1221400], zoom_start=7)
# Получение коордиант из поля "адресс" у модели #
for office in OfficesFilter(self.request.GET, queryset=Offices2.objects.values('address')).qs:
location = geocoder.osm(office.get('address'))
lat = location.lat
lng = location.lng
country = location.country
##Добавление объекта на карту##
folium.Marker(location=[lat, lng], tooltip='Нажмите чтобы узнать больше', popup=country).add_to(m)
m = m._repr_html_()
context['m'] = m
return context
И тут появляется проблема, что чем больше объектов в БД, тем дольше грузится страница и я не понимаю с чем это связано, а самое главное, я не понимаю, как это можно исправить. Я пробовал создавать метки без обращения к БД, а просто выставляя маркеры во view и тогда скорость загрузки страницы не менялась (была изначальной, то есть минимальной), то есть отсюда я делаю вывод, что время загрузки увеличивается из-за обращения к БД.
Изначально был вот такой код:
# Создание карты и изначального её расположения карты #
m = folium.Map(location=[55.7887400, 49.1221400], zoom_start=7)
# Получение коордиант из поля "адресс" у модели #
for office in OfficesFilter(self.request.GET, queryset=Offices2.objects.all().qs:
location = geocoder.osm(office.get('address'))
lat = location.lat
lng = location.lng
country = location.country
##Добавление объекта на карту##
folium.Marker(location=[lat, lng], tooltip='Нажмите чтобы узнать больше', popup=country).add_to(m)
m = m._repr_html_()
context['m'] = m
return context
Я подумал, что получаю слишком много не нужной информации и решил получать только информацию об адресах, и переписал код. Его вы можете увидеть в начале. Но это не повлияло на скорость загрузки.
В чём причина и как это исправить, помогите пожалуйста