Как фильтровать с помощью get_queryset в Django Rest Framework?
В настоящее время API, который я использую, выглядит следующим образом:
http://127.0.0.1:8000/api/locs/data/2
и вывод таков:
{
"id": 2,
"date": "2019-01-07",
"hour": null,
"measurement": null,
"location": 6
}
На самом деле я хочу фильтровать по значению location
, поэтому из приведенного выше API url я бы хотел получить все данные, которые находятся в location: 2
. Как я могу этого добиться?
Что у меня есть на данный момент:
views.py
class LocationDataView(viewsets.ModelViewSet):
serializer_class = LocationDataSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
def get_queryset(self):
queryset = LocationData.objects.all()
pk = self.kwargs['pk']
queryset = queryset.filter(location=pk)
def perform_create(self, serializer):
serializer.save()
и urls.py
from django.urls import path, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'locs', views.LocationListView, 'locs')
router.register(r'locs/data', views.LocationDataView, 'locs/data')
urlpatterns = [
path('', include(router.urls)),
path('locs/forecast-data/',
views.getForecastData, name='forecast-data'),
]
Мой вопрос заключается в том, как я могу получить доступ к pk
для местоположения?
Я думаю, что вам нужно добавить функцию retrieve
в LocationDataView
.
class LocationDataView(viewsets.ModelViewSet):
...
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializers = self.get_serializer(instance)
return Response(serializers.data)
И в urls.py
...
router = routers.DefaultRouter()
router.register(r'locs', views.LocationListView, 'locs')
router.register(r'locs/<int:pk>', views.LocationDataView, 'locs/data')
...