2015-11-03 15 views
7

Pracuję nad api zbudowanym przy użyciu Django Rest Framework. Zdefiniowałem kilka klas model i utworzyłem także kilka filtrów do zastosowania w niektórych zapytaniach, które występują w podanym api-endpoints.Jak ograniczyć wyniki zapytania za pomocą filtrów Django Rest

Próbuję zastosować LIMIT w queryset, ale wolałbym nie używać używania notacji Django e.x. Entry.objects.all()[:5]. Zamiast tego chciałbym móc zastosować limit z wnętrza filtra związanego z modelem.

Do tej pory nie znalazłem żadnego rozwiązania. Myślę, że powinienem znaleźć sposób, aby zdefiniować filtr z wartością domyślną, coś, co spowodowałoby nie ograniczanie zestawu zapytań i jeśli żądanie dotrze do punktu końcowego i zawiera coś w rodzaju ?filter=10, wówczas zestaw zapytań powinien być ograniczony do pierwszego 10.

Odpowiedz

3

można użyć Django reszta ramową paginacji limit. Pagination_class LimitOffsetPagination daje możliwość ograniczenia liczby zwróconych wpisów w query_param.

http://www.django-rest-framework.org/api-guide/pagination/

+0

który jest bardzo zbliżony do tego, co muszę rzeczywiście! Chociaż w tym przypadku chciałbym przesłonić klasę "LimitOffsetPagination" i nadać parametrowi 'offset' wartość domyślną (prawdopodobnie 0), tak aby użytkownik musiał tylko określić parametr' limit'. Mam zamiar użyć 'PageNumberPagination' i zastąpić parametr' page_size_query_param', aby mieć domyślną wartość 'limit'. Czy to brzmi rozsądnie? – LetsPlayYahtzee

+0

Tak, to jest dobre rozwiązanie. Jak stwierdzono w dokumentacji, parametr '' page_size_query_param'' może być użyty do umożliwienia klientowi kontrolowania rozmiaru strony żądania. W '' PageNumberPagination'' ten parametr jest ustawiony jako domyślny na Brak. –

+0

Może to zabrzmieć głupio, ale nie wiem, gdzie umieścić niestandardową klasę stronicowania. – LetsPlayYahtzee

1

można rozszerzyć lub dostosować zajęcia paginacji dostępne w drf

class UserSpecificPagination(LimitOffsetPagination): 
     def get_limit(self, request): 
      if logic_met(request.user): 
      self.max_limit = custom_limit 
     return super(UserSpecificPagination, self).get_limit(request) 

ustawić klasę jako pagination_class w listapiview lub DRF ustawień