2015-11-03 10 views
7

Sto lavorando su un'API costruita con Django Rest Framework. Ho definito diverse classi model e ho anche creato alcuni filtri da applicare su determinate query che si verificano nello specifico api-endpoints.Come limitare i risultati della query con i filtri Django Rest

Sto tentando di applicare LIMIT nello queryset ma preferirei non utilizzare la notazione Django e.x. Entry.objects.all()[:5]. Invece mi piacerebbe essere in grado di applicare il limite dall'interno del filtro associato al modello.

Fino ad ora non ho trovato alcuna soluzione. Sto pensando che dovrei trovare un modo per definire un filtro con valore predefinito qualcosa che risulterebbe non limitando il queryset e se una richiesta raggiunge l'endpoint e contiene qualcosa come ?filter=10 allora il queryset dovrebbe essere limitato al primo 10.

risposta

3

È possibile utilizzare l'impaginazione Django resto Framework. La pagination_class LimitOffsetPagination ti dà la possibilità di limitare il numero di voci restituite in una query_param.

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

+0

che è molto vicino a quello che mi serve davvero! Anche se in questo caso vorrei sovrascrivere la classe 'LimitOffsetPagination' e dare al parametro' offset' un valore predefinito (probabilmente 0) in modo che l'utente debba solo specificare il parametro 'limite'. Sto pensando di usare 'PageNumberPagination' e sovrascrivere il parametro' page_size_query_param' per avere un valore predefinito 'limite'. Suona ragionevole? – LetsPlayYahtzee

+0

Sì, questa è la soluzione giusta. Come indicato nella documentazione, è possibile utilizzare il parametro '' page_size_query_param'' per consentire al client di controllare le dimensioni della pagina di richiesta. In "PageNumberPagination'' questo parametro è impostato come predefinito su Nessuno. –

+0

Potrebbe sembrare sciocco, ma non riesco a capire dove posizionare la classe di impaginazione personalizzata. – LetsPlayYahtzee

1

È possibile estendere o personalizzare le classi di paginazione disponibili in 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) 

impostare la classe come pagination_class in listapiview o DRF impostazioni

Problemi correlati