14 votes

Cadre Django Rest, passage de paramètres avec une requête GET, vues basées sur des classes

Je voudrais qu'un utilisateur envoie une requête GET à mon API REST Django :

127.0.0.1:8000/model/?radius=5&longitude=50&latitude=55.1214

avec sa longitude/latitude et son rayon, passés en paramètres, et obtenir le queryset en utilisant GeoDjango.

Par exemple, actuellement, j'ai :

class ModelViewSet(viewsets.ModelViewSet):
    queryset = Model.objects.all()

Et ce que je veux idéalement, c'est :

class ModelViewSet(viewsets.ModelViewSet):
     radius = request.data['radius']
     location = Point(request.data['longitude'],request.data['latitude']
     # filter results by distance using geodjango
     queryset = Model.objects.filer(location__distance_lte=(location, D(m=distance))).distance(location).order_by('distance')

Maintenant, quelques erreurs immédiates :

1) request n'est pas définie - dois-je utiliser api_view, c'est-à-dire la vue basée sur les fonctions, pour cela ?

2) Page DRF indique que request.data est réservé aux méthodes POST, PUT et PATCH. Comment envoyer des paramètres avec GET ?

24voto

Ozgur Akcali Points 158

Vous pouvez surcharger la méthode get_queryset à cette fin. En ce qui concerne les paramètres de la chaîne de requête, vous avez raison, request.data contient les données POST, vous pouvez obtenir les paramètres de la chaîne de requête via request.query_params.

def get_queryset(self):
    longitude = self.request.query_params.get('longitude')
    latitude= self.request.query_params.get('latitude')
    radius = self.request.query_params.get('radius')

    location = Point(longitude, latitude)

    queryset = Model.objects.filter(location__distance_lte=(location, D(m=distance))).distance(location).order_by('distance')

    return queryset

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X