Как фильтровать с помощью 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')
...
Вернуться на верх