web-dev-qa-db-fra.com

Django Rest Framework, transmission de paramètres avec une requête GET, vues classées

Je voudrais qu'un utilisateur envoie une demande GET à mon Django REST:

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

avec sa longitude/latitude et son rayon, passé 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éfini - devrais-je utiliser api_view, c’est-à-dire la vue basée sur les fonctions pour cela?

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

14
GRS

Vous pouvez remplacer la méthode get_queryset à cette fin. En ce qui concerne les paramètres de chaîne de requête, vous avez raison, request.data contient les données POST, vous pouvez obtenir des paramètres de 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
25
Ozgur Akcali