2014-11-28 3 views
5

Sto usando Django REST Framework e sto usando i filtri per filtrare il set di query.Come posso interrompere il framework REST di django per mostrare tutti i record se il parametro di query è sbagliato

http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

simili

http://example.com/api/products/4675/?category=clothing&max_price=10.00

ma ho visto che se non v'è errore in filters oi parametri di ricerca non esiste quindi visualizza tutti i risultati che è molto male.

Io invece voglio alcun risultato se non v'è problema con i parametri di query, perché a volte non so se questo funziona o non

EDIT

Questo è il mio codice

class userFilter(django_filters.FilterSet): 
    strict = True 

    class Meta: 
     model = User 
     fields = ('is_active', 'is_archived', 'age') 

REST

class UserListCreateView(generics.ListCreateAPIView): 
    queryset = User.objects.filter(is_archived=False) 
    ordering_fields = ('is_active') 
    filter_class = userFilter 

si tratta di impostazioni REST

012.
REST_FRAMEWORK = { 
    'DEFAULT_MODEL_SERIALIZER_CLASS': 
     'rest_framework.serializers.HyperlinkedModelSerializer', 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.IsAuthenticated', 
    ], 
    'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.DjangoFilterBackend', 
     'rest_framework.filters.SearchFilter', 
     'rest_framework.filters.OrderingFilter', 
    ), 
    # 'PAGINATE_BY': 1,     
    'PAGINATE_BY_PARAM': 'page_size', 
    'MAX_PAGINATE_BY': 100,    
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 
+0

dovresti pubblicare il tuo codice .. avrà senso dopo averlo guardato .. se stai letteralmente seguendo il link a cui ti riferisci .. risulterà nel dare tutti i risultati in quanto restituisce un set di query che è stato inizializzato su objects.all , piuttosto, controlla per query_params e se non è corretto restituisci Nessuno .. per una risposta migliore sputa il tuo codice! –

+0

@vijayshanker hi vijay, ho aggiunto il codice. si prega di dare un'occhiata – user3214546

+0

override metodo get_queryset .. e cercare QUERY_PARAMS in richiesta per restringere i risultati .. questo dovrebbe fare –

risposta

4

Se si utilizza il DjangoFilterBackend, dare un'occhiata allo strict Non-Meta option.

L'opzione strict controlla se i risultati vengono restituiti quando un valore non valido viene specificato dall'utente per qualsiasi campo filtro. Per default, , strict è impostato su True, il che significa che un queryset vuoto è restituito se qualsiasi campo contiene un valore non valido. È possibile allentare questo comportamento impostando severamente su False che ignorerà effettivamente un campo di filtro se il suo valore non è valido.

Il filtro:

from django_filters.filterset import FilterSet 

class UserFilter(FilterSet): 
    strict = True 

    class Meta: 
     model = User 
     fields = ['username'] 

Le impostazioni: (presumono siano stati installati django-filter)

REST_FRAMEWORK = { 
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',) 
} 

Ora, se qualcuno fa:

http://api.example.com/users/?username=myuser&badfilter=1 

... restituirà una lista vuota, poiché badfilter non esiste.

Poiché FilterSet imposta automaticamente il valore strict=True, ho la sensazione che non si stia sfruttando lo DjangoFilterBackend.

+0

grazie, non ho avuto rigorosamente true – user3214546

+1

@Michale, l'ho provato e mi mostra ancora tutti i record. Penso che ci sia qualche impostazione REST piuttosto che nei filtri. Puoi controllare lo – user3214546

+0

Avrei bisogno di vedere le tue impostazioni per 'REST_FRAMEWORK' dal tuo file delle impostazioni. Mi scuso per aver risposto tardi. –

1

La risposta contrassegnata non ha funzionato per me. Ho risolto eseguendo l'override del metodo "get":

class UserListCreateView(generics.ListCreateAPIView): 
    queryset = User.objects.filter(is_archived=False) 
    ordering_fields = ('is_active') 
    filter_class = userFilter 

    @staticmethod 
    def is_valid_query_params(query_params): 
     # do validations here 
     ... 

    def get(self, request, *args, **kwargs): 
     if not self.is_valid_query_params(request.query_params): 
      return Response([]) # send empty response 
     return super(UserListCreateView, self).get(request, *args, **kwargs) 
+0

Stesso caso qui. Per coloro che utilizzano ModelViewSet invece di generici, tieni presente che dovresti eseguire l'override di 'list' invece di' get'. Il problema è che in questo caso è necessario sovrascrivere anche l'altro metodo (azioni) (recupero, aggiornamento, ecc.) :( – chefarov

+0

Mi è piaciuto sovrascrivere get_queryset di più (preferenza personale). – gabn88

0

tuo problema specifico deriva dal fatto che i parametri che invochi nella query GET non sono definiti nel vostro UserFilter.Pertanto verranno prese solo i seguenti parametri di calcolo da DRF:

fields = ('is_active', 'is_archived', 'age') 

Inoltre strict controlla solo il valore di un parametro di query , non se il parametro stesso esiste. Per esempio

GET mydomain.com/resource_path?whatever=blabla 

restituisce l'intero queryset che è qualcosa che non va, a mio parere, almeno non REST-compliant.

Ho finito per scrivere un piccolo metodo per verificare manualmente se esistono effettivamente i parametri di query passati nella richiesta.

Problemi correlati