Не могу отфильтровать геоданные на стороне бэкенд для вывода геотэгов через слой представления GeoJSONLayerView

Мне надо отображать метеостанции только в тех областях страны, которые выберет пользователь. Но средства GeoDjango не позволяют отфильтровать данные в бэкенде. GeoJSONLayerView извлекает все данные из таблицы, и весь список мне приходится фильтровать в leaflete на фронтэнде. Записей в таблице очень много, из-за чего время отклика очень большое(для отображения и фильтрации уходит больше 5 минут), либо вовсе вылетает с сервера. Как мне сделать фильтрацию в бэкенде? Может есть другой способ? Пробовала просто сделать выборку, и сериализовать данные через geojsonserializer - ничего не вышло, leaflet не выдает ошибку входных данных. Использую: Postgis, Django, Leaflet.

models.py

class WeatherStation(gismodels.Model):

    id_station = models.IntegerField(primary_key=True)
    station_index = models.IntegerField(default = None)
    name_station_rus = models.CharField(default="", max_length=256)
    name_station_en = models.CharField(default="", max_length=256)
    id_ugms = models.ForeignKey(Ugms, on_delete=models.CASCADE, default = None)
    id_country = models.ForeignKey(Country, on_delete=models.CASCADE, default = None) 
    id_subrf = models.ForeignKey(Subrf, on_delete=models.CASCADE, default = None)
    latitude = models.CharField(default ="", max_length=256)
    longitude = models.CharField(default ="", max_length=256)
    geom = gismodels.PointField(default ='POINT EMPTY',srid = 4326)
    objects = gismodels.Manager()
    height_above_sea = models.CharField(default="", max_length=256)
    access_level = models.CharField(default="", max_length=256)

    def __unicode__(self):
        return self.id_station

urls.py

from django.urls import path
from obsnet import  views
from django.views.generic import TemplateView
from django.conf.urls import  re_path
from djgeojson.views import GeoJSONLayerView
from obsnet.models import WeatherStation
from obsnet.views import StationGeoJSONLayerView

urlpatterns = [
    path('', views.home, name='home'),

    re_path(r'^filterstation.geojson$', StationGeoJSONLayerView.as_view(), name = 'filterstation'),
]

views.py

from django.contrib.gis.geos import Point, Polygon

from obsnet.models import WeatherStation
from obsnet.forms import FilterForm
from datetime import datetime
from django.shortcuts import render
from django.http import HttpRequest
import json

from django.contrib.gis.geos import GEOSGeometry
from django.core.serializers import serialize
from djgeojson.serializers import Serializer as GeoJSONSerializer
from djgeojson.views import GeoJSONLayerView
from django.conf.urls import  re_path
from djgeojson.http import HttpGeoJSONResponse
from django.http import HttpResponseRedirect
from django.urls import  reverse

def home(request):
    """Renders the home page."""

    assert isinstance(request, HttpRequest)
    id_s = None
    id_fed = None
    id_country = None
    id_ugms = None
    if request.method == 'POST':

        form = FilterForm(request.POST)
        # check whether it's valid:
        if form.is_valid():

            id_ugms = form.cleaned_data.get('filter_ugms')
            if (id_ugms == '0') : 
                id_ugms = None
 
            return render(
                request,
                'obsnet/index.html',
               
                { 
                    'form' : form,
                    'title' : 'Home Page',
                    'year' : datetime.now().year,
                    'id_ugms' : id_ugms, 
                
                },        
            )

    else:
        form = FilterForm()
   
    
    return render(
        request,
        'obsnet/index.html',
        {
            'form' : form,
            'title' : 'Home Page',
            'year' : datetime.now().year,

        },        
    )

class StationGeoJSONLayerView(GeoJSONLayerView):
    model = WeatherStation
    properties = ['name_station_rus', 'station_index', 'id_subrf', 'id_country',  'id_ugms' ]
    def head(self, *args, **kwargs):
        response = HttpGeoJSONResponse('')
        return response

index.html

{% load leaflet_tags %}
{% load geojson_tags %}
<html>
  <head>
    {% leaflet_js %}
    {% leaflet_css %}

    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <style>
    .filter-map-box{
    height: 65%;
    width: 20%;
    float: left;
    position: fixed; 
    background-color: #ffffff;
    top: 5%; /* Расстояние сверху */
    left: 5%;
    padding: 10px;
    -webkit-box-shadow: 5px 5px 15px 5px rgba(0,0,0,0.27); 
    box-shadow: 5px 5px 15px 5px rgba(0,0,0,0.27);
    z-index: 9999;
    }
    .map-block{
    /*width: 75%;*/
    }
    
    .leaflet-container {  /* all maps */
                       
        width:  100%;
        height: 100%;
    }

    #specialbigmap {
        height: 1000px;
    }

    /* Resize the "display_raw" textbox */
    .django-leaflet-raw-textarea {
        width: 100%;
    }
    </style>
  </head>
  <body>

   
      <div class = "map-block">
    {% leaflet_map "main" callback="main_map_init" %}

    <script type="text/javascript">
        function main_map_init (map, options) {
    

            var ugms = '{{ id_ugms }}';
            
            var suburl = '{% url "filterstation" %}';
            // Download GeoJSON via Ajax
            $.getJSON(suburl, function (filterstation) {
                // Add GeoJSON layer
                var fea = filterstation.features;
                if (ugms !== 'None') 
                {
                    
                    for (i = 0; i < fea.length; i++)
                    {
                        var prop = fea[i].properties;
                            if (prop.id_ugms == ugms)
                            {
                                console.log(idfiltr );
                                L.geoJson(filterstation.features[i]).addTo(map).bindPopup(prop.name_station_rus);
                            }
                    }
                
                }

                
            });
            
            

            map.setMaxBounds([[-90,-180], [90,200]]);
            map.options.maxBoundsViscosity = 1.0;   
        
    L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: '&copy; <a rel="nofollow" href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        }).addTo(map);
        
        }
    </script>
    
    </div>
    <div class = "filter-map-box">
    
        <form action="" method="post">
                <label for="id_filter_label">Фильтр</label>
                {% csrf_token %}
                {{ form.as_p }} 
                <input type="Submit" name="submit" value="Отобразить"/>

        </form>

    </div>
     
  </body>
</html>

Ответы (0 шт):