Как ограничить количество записей из запроса GeoDjango Postgis django-rest-framework?

Я создал базовую функциональность отображения Django с помощью этого руководства , но Python продолжает разрывать 32 ГБ оперативной памяти и/или браузер падает, предположительно потому, что запрос не ограничивается первыми n результатами, а в БД миллионы записей.

Мой "vietsets.py":

from rest_framework import viewsets
from rest_framework_gis import filters

from core.models import Tablename
from core.serializers import MarkerSerializer

class MarkerViewSet(viewsets.ReadOnlyModelViewSet):

    bbox_filter_field = "geom"
    filter_backends = (filters.InBBoxFilter,)
    queryset = Tablename.objects.all()
    serializer_class = MarkerSerializer

Я думаю, что InBBoxFilter нуждается в доработке, но в документации не упоминается никаких дополнительных опций. В документации говорится, что "если вы используете другие фильтры, вы захотите включить бэкенд вашего другого фильтра в ваше представление", приводя пример filter_backends = (InBBoxFilter, DjangoFilterBackend,), но я хочу только ограничить количество результатов для функциональности InBBoxFilter, которая уже предоставляется. Могу ли я написать что-то вроде DjangoFilterBackend для ограничения результатов? Или это лучше сделать с помощью функциональности django-rest-framework?

Как я могу сказать ему, чтобы он ограничил количество результатов или иным образом улучшил производительность при использовании больших баз данных?

Вы можете использовать Pagination https://www.django-rest-framework.org/api-guide/pagination/

from rest_framework import viewsets
from rest_framework_gis import filters
from rest_framework.pagination import PageNumberPagination

from core.models import Tablename
from core.serializers import MarkerSerializer

    
class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000


class MarkerViewSet(viewsets.ReadOnlyModelViewSet):

    bbox_filter_field = "geom"
    filter_backends = (filters.InBBoxFilter,)
    queryset = Tablename.objects.all()
    serializer_class = MarkerSerializer
    pagination_class = StandardResultsSetPagination

# request host/api/<your_url>?page=<page_num>&page_size=<page_size>
# will limit size of your response
# and response will include current_page, number_of_elements and  last_page.

Изменить на нижеприведенный. Эта пагинация поддерживается restframework_gis.

from rest_framework import viewsets
from rest_framework_gis import filters
from rest_framework_gis.pagination import GeoJsonPagination

from core.models import Tablename
from core.serializers import MarkerSerializer


class MarkerViewSet(viewsets.ReadOnlyModelViewSet):
    bbox_filter_field = "geom"
    filter_backends = (filters.InBBoxFilter,)
    queryset = Tablename.objects.all()
    serializer_class = MarkerSerializer
    pagination_class = GeoJsonPagination

Вы можете обновить свой сервер или ограничить результат (пагинация). Наиболее подходящая пагинация зависит от вашего запроса. Вы можете сгруппировать области по какому-либо правилу или чему-либо еще.

Вернуться на верх