2015-09-19 18 views
6

Desidero restituire model_info solo se viene fornito query_params altrimenti dovrebbe fornire un messaggio di errore.Validazione su query_params in Django Rest Framework

Ho provato sotto il codice ma mi sta dando il keyerror quando il nome non viene passato nei parametri della query.

from rest_framework.validators import ValidationError 

class ModelSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ModelName 
     fields = ('name', 'abbreviation') 

    def validate_name(self, value): 
     if value: 
      return value 
     else: 
      raise ValidationError('Enter name') 



class ModelNameListList(generics.ListCreateAPIView): 
    renderer_classes = (JSONRenderer,) 
    serializer_class = ModelSerializer 

    def get_queryset(self): 
     queryset = ModelName.objects.all() 
     name = self.request.query_params['name'] 
     queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all() 
     return queryset 

non posso usare ottenere metodo, perché Inoltre sto usando l'impaginazione, se userò ottenere metodo che mi restituirà tutti i risultati.

Quando sto usando qui sotto il codice a get_queryset sto diventando oggetto risposta è no Lunghezza

def get_queryset(self): 
     queryset = ModelName.objects.all() 
     name = self.request.query_params.get('name', None) 
     if name: 
      queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all() 
     else: 
      content = {'errors': 'name is missing'} 
      return Response(content) 
     return queryset 

risposta

2

Con questa funzione:

def get_queryset(self): 
     queryset = ModelName.objects.all() 
     name = self.request.query_params.get('name', None) 
     if name: 
      queryset = queryset.filter(Q(name__icontains=name) | Q(abbreviation__icontains=name)).all() 
     else: 
      raise exceptions.ParseError("name not supplied") 
     return queryset 

è necessario assicurarsi che si sta sempre restituisce un queryset (o generare un'eccezione se è così che si vuole gestirlo).

+3

Probabilmente dovrebbe essere "exceptions.ValidationError' -' ParseError' è riservato per dati non validi in base a [docs] (http://www.django-rest-framework.org/api-guide/exceptions/#parseerror) mentre 'ValidationError' è per dati ben formati che non soddisfano le linee guida di convalida. – connorbode

+0

@connorbode stavo pensando lo stesso, ma quando provo a sollevare 'ValidationError' da' View' getta l'errore del server 500 dice 'Errore di convalida a ./../' invece di una risposta JSON ben formata. Penso che 'ValidationError' è stick per Serializers. non sono sicuro –

Problemi correlati