10

我目前有一个 API 视图设置如下:

class WeatherObservationSerializer(serializers.ModelSerializer):
    dew_point = serializers.Field(source='dew_point')
    wind_gust = serializers.Field(source='get_wind_gust')

    class Meta:
        model = WeatherObservation
        fields = ('id', 'station', 'temperature', 'pressure', 'humidity',
                  'wind_direction', 'wind_speed', 'rainfall', 'date',
                  'dew_point', 'wind_gust')

class WeatherObservationList(generics.ListCreateAPIView):
    model = WeatherObservation
    serializer_class = WeatherObservationSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def get_queryset(self):
        queryset = WeatherObservation.objects.all()
        min_date = self.request.QUERY_PARAMS.get('min_date', None)
        station = self.request.QUERY_PARAMS.get('station', None)
        if min_date is not None:
            queryset = queryset.filter(date__gte=min_date)
        if station is not None:
            queryset = queryset.filter(station=station)
        return queryset

我的settings.py包含:REST_FRAMEWORK = { 'PAGINATE_BY': 50, 'PAGINATE_BY_PARAM': 'page' }

当我像这样向 API 发出请求时: /api/weather/observations/?station=2&page=2&min_date=2013-3-14 我只得到两个结果。如果是第 3 页、第 3 个结果等。有什么我做错了导致这个问题吗?

干杯。

4

3 回答 3

5

查看这些设置的文档:

PAGINATE_BY_PARAM

查询参数的名称,客户端可以使用它来覆盖用于分页的默认页面大小。如果设置为无,客户端可能不会覆盖默认页面大小。

只需从您的 settings.py 中删除该行,就可以了。

2016 年 1 月 7 日更新:

请注意,此设置现在处于弃用过程中。您可以查阅分页指南以获取更多详细信息。

简短的版本是您现在应该使用适当的设置创建一个自定义分页类,然后将其应用于您的视图。链接指南中的示例应该很有帮助。

于 2013-03-15T19:25:55.437 回答
2

不确定这会有多大帮助,但我需要在我的项目中使用过滤器对单个视图进行分页。我所做的是

class GlobalFilter(CustomMixin):

    from rest_framework.pagination import PageNumberPagination

    queryset = Data.objects.all()
    filter_backends = [DjangoFilterBackend]
    serializer_class = FilterSerializer
    filterset_class = GlobalFilterSet
    pagination_class = PageNumberPagination
    pagination_class.page_size = 100

可能对其他人有帮助:)

于 2019-10-14T11:34:43.980 回答
0

使用过滤和分页插件。很好地处理过滤器和分页功能

pip install filter-and-pagination

于 2020-05-09T18:11:20.537 回答