Передать запрос с URL-адресом в Django REST Framework

#django #parameters #django-rest-framework #django-urls

#django #параметры #django-rest-framework #django-urls

Вопрос:

Я чувствую, что это должно быть просто, но то, что я делаю, не окупается.

В Django у меня есть это urls.py в моем приложении:

 from django.urls import path

from .views import PostcodessAPIListView, PostcodesAPIID, PostcodesWithinRadius

urlpatterns = [
    path("<str:postcode>/<int:radius_km>", PostcodesWithinRadius.as_view(), name="results_api_radius"),
    path("", PostcodessAPIListView.as_view(), name="results_api_list"),
    path("<int:pk>", PostcodesAPIID.as_view(), name="results_api_detail"),
]
 

И у меня есть это представление, которое должно принимать почтовый индекс и радиус в км, вызывать внешний api для преобразования почтового индекса в долготу и широту, а затем снова вызывать внешний API для получения почтовых индексов в определенном радиусе.

 class PostcodesWithinRadius(generics.RetrieveAPIView):
    serializer_class = PostcodeSerializer

    def get_queryset(self):
        postcode = self.request.query_params.get('postcode', None)
        radius_km = self.request.query_params.get('radius_km', None)
        print(postcode, radius_km)
        postcodes = self.get_postcodes_within_radius(postcode, radius_km)
        print(postcodes)
        return Postcode.objects.filter(postcode__in=postcodes)

    def get_postcodes_within_radius(self, postcode, radius_km):

        radius_km = 3
        postcodes_within_radius = []

        if radius_km <= 20:
            radius = radius_km * 1000
        else:
            raise ValueError('Radius cannot be over 20km.')

        GET_LAT_LON_URL = f"{POSTCODE_URL}?"

        postcode_query = {
            "query": postcode
        }

        postcode_data = requests.get(GET_LAT_LON_URL, headers=None, params=postcode_query).json()
        print(postcode_data)
        querystring = {
            "longitude": postcode_data['result'][0]['longitude'],
            "latitude": postcode_data['result'][0]['latitude'],
            "wideSearch": radius,
            "limit": 100,
        }

        res = requests.get(POSTCODE_URL, headers=None, params=querystring).json()


        for postcode in res['result']:
            postcodes_within_radius.append(postcode['postcode'])
        return postcodes_within_radius
 

Однако почтовый индекс и радиус не передаются через параметры URL-адреса — что дает?

Ответ №1:

Вы не передаете postcode и radius как query параметры, а скорее как url параметры.

Ваш метод будет работать, если ваш url был чем-то вроде:

 http://localhost:8000/postcodes/?postcode=0000amp;radius=5
 

Но поскольку вы используете url параметры:

 http://localhost:8000/<postcode>/<radius>
 

Вам нужно будет изменить свой get_queryset метод. Попробуйте это:

 def get_queryset(self):
    postcode = self.kwargs.get('postcode', None)
    radius_km = self.kwargs.get('radius_km', None)
    print(postcode, radius_km)
    postcodes = self.get_postcodes_within_radius(postcode, radius_km)
    print(postcodes)
    return Postcode.objects.filter(postcode__in=postcodes)
 

Комментарии:

1. Хорошо, это сработает, если я изменю класс, чтобы расширить дженерики. ListAPIView вместо RetrieveAPIView

Ответ №2:

почему бы вам просто не использовать get() метод

 class PostcodesWithinRadius(generics.RetrieveAPIView):
    serializer_class = PostcodeSerializer

    def get(self, request, **kwargs):
        postcode = kwargs.get('postcode')
        radius_km = kwargs.get('radius_km')
        # rest of the logic