1

次のコードがあります。

class GeonamesCountryViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = (AllowAny,)
    serializer_class = GeonamesCountrySerializer
    ordering = ('country_name',)
    offset_limit = 'required'

    def get_queryset(self):
        country_geoname_ids = self.request.QUERY_PARAMS.get('country_geoname_ids', None)
        name_prefix = self.request.QUERY_PARAMS.get('name_prefix', None)

        if (country_geoname_ids is None) and (name_prefix is None):
            raise exceptions.ParseError("Either 'country_geoname_id' or 'name_prefix' must be defined.")

        if country_geoname_ids is not None:
            country_geoname_ids = [param.strip() for param in country_geoname_id.split(',')]
            queryset = GeonamesCountry.objects.filter(country_geoname_id__in = country_geoname_ids)

        if name_prefix is not None:
            if len(name_prefix) < 2:
                raise exceptions.ParseError("'name_prefix' must be at least 2 characters long")
            queryset = GeonamesCountry.objects.filter(country_name__istartswith = name_prefix)

        paginator = Paginator(queryset, self.request.QUERY_PARAMS.get('limit', 10))
        selected_page = self.request.QUERY_PARAMS.get('page')

        try:
            countries = paginator.page(selected_page)
        except EmptyPage:
            raise exceptions.ParseError("'Page Empty")


        return queryset

raise exceptions.ParseError("'Page Empty")EmptyPage 例外がスローされる代わりに、ページ 1 をデフォルトにすることは可能ですか?

ドキュメントを読んだ後、ビューセットを使用しない場合は簡単に実行できることがわかりましたが、ビューセット内からどのように実行できますか?

4

1 に答える 1

4

これを行うことで、あなたは非常に安全になると思います:

try:
    countries = paginator.page(selected_page)
except InvalidPage:
    countries = paginator.page(1)

例外に注意してInvalidPageください。数値以外もカバーできます。

- アップデート -

ページネーションクラスをオーバーライドするのが最もクリーンな方法のようです。返されたページ番号を制御できる唯一の方法です。

from django.core.paginator import Paginator, InvalidPage

class MyPaginator(Paginator):
    def validate_number(self, number):
        try:
            number = super(MyPaginator, self).validate_number(number)
        except InvalidPage:
            number = 1

        return number


class GeonamesCountryViewSet(viewsets.ReadOnlyModelViewSet):
    paginator_class = MyPaginator
    ...
于 2013-11-13T17:43:10.273 に答える