J'utilise le cadre de repos django. Voici mon code:Django Rest paramètres requis dans l'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
Je veux obtenir des valeurs de l'URL comme ceci: /users/show?user_id=1
ou /users/show?username=mike
.
Un paramètre user_id
ou username
doit être requis. Comment puis-je le contrôler dans les vues basées sur les classes?
Avec mon code si j'envoie la demande avec le mauvais nom de paramètre /users/show?user111name=mike
ou simple /users/show
la vue de réponse bien sûr moi avec queryset = User.objects.all()
et répertorie tous les utilisateurs. Je n'ai pas besoin de ça. J'ai besoin si les paramètres requis sont None
réponse avec 404.
Je me nécessaire résultat avec vue sur la base fonction:
@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)
Mais comment puis-je faire avec vues génériques sur la base de classe?
Vous s hould jeter un oeil à http://stackoverflow.com/questions/36505792/drf-base-viewset-for-query-param-validation – trinchet
Pourriez-vous m'expliquer pourquoi vous utilisez ListAPIView pour obtenir un objet * simple *? Il y a un RetrieveAPIView dédié pour une telle utilisation, plus vous pouvez avoir le nom d'utilisateur ou l'id utilisé dans le cadre de l'url pas question .. – Jerzyk