Как получить параметр url с помощью django-rest-framework
Я строю карту с различным расположением станций. Станции принадлежат разным полям. Мне нужно показать все станции, и у меня есть все станции одного месторождения.
В какой-то момент вызывается мой api
"""Markers API URL Configuration."""
# Maps with Django (2)
# https://www.paulox.net/2021/07/19/maps-with-django-part-2-geodjango-postgis-and-leaflet/
from rest_framework import routers
from map.viewsets import MarkerViewSet
router = routers.DefaultRouter()
router.register(r"map", MarkerViewSet)
urlpatterns = router.urls
тогда вызывается MarkerViewSet (viewsets.py)
class MarkerViewSet(viewsets.ReadOnlyModelViewSet):
"""Marker view set."""
#print(self.kwargs.get('idfield'))
bbox_filter_field = "location"
filter_backends = (filters.InBBoxFilter,)
queryset = Stations.objects.filter(station_active=1, map=1)
serializer_class = StationsSerializer
def get_queryset(self, **kwargs):
#field_id = self.kwargs['idfield']
#print("pp:", self.kwargs)
return Stations.objects.filter(fields_id_field=1)
Код выше работает, но он показывает только маркеры поля 1
Если я изменю это на 2
return Stations.objects.filter(fields_id_field=2)
Показать все станции поля с id 2
Мой url имеет следующий вид http://127.0.0.1:8080/map/ для печати всех станций всех полей. Если я хочу иметь станции поля 1, мой url будет
http://127.0.0.1:8080/map/1/field
и для поля 2 и 4
http://127.0.0.1:8080/map/2/field
http://127.0.0.1:8080/map/4/field
Моя проблема, я не могу и не знаю как получить id 1,2,4 или другую форму моего url
это не работает
#field_id = self.kwargs['idfield']
#print("pp:", self.kwargs)
Вот мой map/urls.py мой проект urls.py
Нужно ли мне попытаться получить id поля из viewsets.py или как бы вы предложили мне архивировать мою цель?
РЕДАКТИРОВАТЬ: Вот мой views.py. Здесь я могу получить idfield. Есть ли способ передать его my viewsets.py?
kwargs
из GET-запроса можно получить следующим образом
request.GET.get("idfield")
Я полагаю, что ваше предложение работает только в файле views.py, поскольку он начинается с
def field(request, idfield):
request.GET.get("idfield")
не так ли?
Я работаю с файлом viewsets.py, начинающимся с
class MarkerViewSet(viewsets.ReadOnlyModelViewSet):
"""Marker view set."""
bbox_filter_field = "location"
filter_backends = (filters.InBBoxFilter,)
queryset = Stations.objects.filter(station_active=1, map=1)
serializer_class = StationsSerializer
"""
def get_tags(self):
return Stations.objects.filter(fields_id_field=1)
"""
def get_queryset(self):
#field_id = self.kwargs['idfield']
#print("ppp:", self.kwargs['idfield'])
return Stations.objects.filter(fields_id_field=1)
Я знаю, куда можно добавить ваше предложение.
Однако я думаю, что приблизился к решению, но я все еще получаю ошибку.
Надеюсь, вы сможете мне помочь
Во-первых, в моем файле map.js. я добавил
async function load_markers() {
const markers_url = `/api/map/1/`; // LOOK AT THIS LINE
console.log("markers_url: ",markers_url);
const response = await fetch(markers_url);
//console.log("response: ",response);
const geojson = await response.json();
console.log("geojson: ",geojson);
return geojson;
}
В моем файле urls.py я изменил на
path("api/<int:idf>/", include("map.api")),
, который перенаправит на файл api.py. Я думаю, что до этого момента все правильно, не так ли?
В моем api.py файле я пробовал разные вещи, вдохновляясь django-rest-framework - router page
router = routers.DefaultRouter()
#router.register(r"map", MarkerViewSet) #INITIAL
#router.register(r"^map/{idf}/$", MarkerViewSet) #I tried this
#router.register(r"^map/(?P<idf>[0-9]+)/$", MarkerViewSet) #this generate an error because of idf
router.register(r"^map/(?P<id_f>[0-9]+)/$", MarkerViewSet)
urlpatterns = router.urls
Еще одно сообщение об ошибке в Firefox: введите описание изображения здесь
Я считаю, что должен найти правильный формат, но что-то еще должно быть неправильно
Большое спасибо за помощь