Ich benutze Django Rest Framework. Hier ist mein Code:Django Rest erforderliche Parameter in URL
urls.py:
urlpatterns = [
url(r'^users/show', UserShow.as_view()),
]
view.py:
class UserShow(ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def get_queryset(self):
queryset = User.objects.all()
username = self.request.query_params.get('username', None)
user_id = self.request.query_params.get('user_id', None)
if username is not None:
queryset = queryset.filter(username=username)
if user_id is not None:
queryset = queryset.filter(pk=user_id)
return queryset
Ich möchte wie diese Werte von der URL erhalten: /users/show?user_id=1
oder /users/show?username=mike
.
Entweder muss ein user_id
oder username
Parameter erforderlich sein. Wie kann ich es in klassenbasierten Ansichten steuern?
Mit meinem Code, wenn ich die Anfrage mit falschem Parameternamen senden /users/show?user111name=mike
oder einfach /users/show
die Ansicht der Kursantwort mich mit queryset = User.objects.all()
und listet alle Benutzer auf. Ich brauche das nicht. Ich muss bei Bedarf Parameter None
Reaktion mit 404.
sind, kann ich mit Funktion basiert Ansicht benötigt Ergebnis:
@api_view(['GET'])
def users(request):
if request.method == 'GET':
queryset = User.objects.all()
username = request.GET.get('username', None)
user_id = request.GET.get('user_id', None)
if username is not None:
queryset = queryset.filter(username=username)
elif user_id is not None:
queryset = queryset.filter(pk=user_id)
else:
return Response({"status": "required field not found."},
status=status.HTTP_404_NOT_FOUND)
if not queryset.exists():
return Response({"status": "not found."},
status=status.HTTP_404_NOT_FOUND)
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
Aber wie kann ich es tun mit generic Klasse basierte Ansichten?
Sie sind http://stackoverflow.com/questions/36505792/drf-base-viewset-for-abfrage-param-validierung – trinchet
Könnten Sie mir bitte erklären, warum Sie ListAPIView verwenden, um * single * object zu bekommen? Es gibt eine RetrieveAPIView, die für eine solche Verwendung dediziert ist, und Sie können den Benutzernamen oder die ID als Teil der URL verwenden, die nicht abgefragt wird. – Jerzyk