2015-09-19 11 views
6

Chcę zwrócić wyrażenie_modelu tylko, jeśli podano query_params, w przeciwnym razie powinien dać komunikat o błędzie.Sprawdzanie poprawności w query_params w Django Rest Framework

Próbowałem poniżej kodu, ale daje mi keyerror, gdy nazwa nie jest przekazywana w parametrach zapytania.

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 

nie mogę użyć uzyskać metody, ponieważ jestem również za pomocą paginacji, Jeśli użyję dostać metody zwróci mi wszystkie wyniki.

Kiedy używam poniżej kod w get_queryset jestem coraz obiekt odpowiedzi ma długość

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 

Odpowiedz

2

Dzięki tej funkcji:

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 

powinien upewnić się, że są zawsze Zwracanie queryset (lub zgłaszanie wyjątku, jeśli w ten sposób chcesz go obsłużyć).

+3

Prawdopodobnie powinien być 'exceptions.ValidationError' -' ParseError' jest zarezerwowany dla zniekształconych danych zgodnie z [docs] (http://www.django-rest-framework.org/api-guide/exceptions/#parseerror) podczas gdy "ValidationError" dotyczy dobrze sformułowanych danych, które nie spełniają wytycznych dotyczących walidacji. – connorbode

+0

@connorbode Myślałem o tym samym, ale kiedy próbuję podnieść 'ValidationError' z' View' to zgłasza błąd serwera 500 mówi 'Validation Error na ./../' zamiast dobrze sformułowanej odpowiedzi JSON. Myślę, że 'ValidationError' trzyma się Serializatorów. niepewny –

Powiązane problemy