Django Rest Framework - Похоже, что пагинация набора запросов происходит некорректно, что приводит к длительному времени ожидания перед отображением на передней панели.

Я столкнулся с проблемой, когда на получение 25 элементов в постраничном ответе уходит до 30 секунд. Это происходит при первоначальной загрузке страницы, а также при любых последующих запросах страницы через кнопки datatables previous и next.

В рассматриваемой модели примерно 600 тыс. записей, при этом запрос к api содержит параметр запроса для фильтрации по типу объявления (сдача в аренду или продажа). Есть и другие фильтры, применяемые к набору запросов, чтобы игнорировать элементы, которые не попадают в очередь, оставляя 37 тысяч записей на стороне продажи и 90 тысяч на аренде, которые возвращаются.

Структура моей модели выглядит следующим образом:

Мой сериализатор:


class ListingSerializer(serializers.ModelSerializer):
    type_display = serializers.CharField(read_only=True)
    process_display = serializers.CharField(read_only=True)

    class Meta:
        model = Listing
        fields = [
            'listing_id',
            'url',
            'address',
            'date',
            'agent',
            'sector',
            'in_user_queue',
            'process_probability',
            'portal',
            'assigned_user',
            'updated_by',
            'type_display',
            'process_display',
            'updated_timestamp'
        ]
        depth = 0

Viewset is:

class GlobalQueueVS(viewsets.ReadOnlyModelViewSet):
    serializer_class = serializers.ListingSerializer
    http_method_names = ['get']
    permission_classes = [permissions.IsAuthenticated]
    search_fields = ["sector__sector", "assigned_user__username"]

    def get_queryset(self):
        filters = {'processed': False, 'unprocessable': False, 'available': True}
        to_buy = self.request.query_params.get('to_buy', None)
        if to_buy is not None:
            filters['to_buy'] = to_buy
        queryset = Listing.objects.exclude(sector_id=None).order_by('sector_id', '-date').prefetch_related(
            'sector', 'assigned_user').only(
            'processed', 'unprocessable', 'available', 'to_buy', 'listing_id', 'url', 'address', 'date', 'agent',
            'sector', 'in_user_queue', 'process_probability', 'portal', 'assigned_user'
        ).filter(**filters)
        return queryset

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

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