正确的DRF筛选器列表视图终结点,以按ID返回多个对象

时间:2018-11-13 20:11:56

标签: django django-rest-framework django-urls

我希望能够通过带有GET请求的url参数在单个DRF请求中通过id请求多个db对象。我通读了this stackoverflow postfiltering against query parameters上的DRF文档,以为我了解如何实现,但是我的解决方案还差一点。它将返回一个响应,但不过滤查询集(多个id响应为{"detail":"Not found."}

views.py

@permission_classes((HasAPIAccess, HasUnrestrictedAPIAccess, ))
class EventListView(generics.ListAPIView):
    serializer_class = EventSerializer
    queryset = Event.objects.all()

    def get_queryset(self):
        ids = self.request.query_params.get('ids', None)
        if ids is not None:
            ids = [ int(x) for x in ids.split(',') ]
            queryset = Event.objects.filter(pk__in=ids)

        else:
            queryset = Event.objects.all()[0:10]

        return queryset

urls.py

router = DefaultRouter()
router.register(r'events', EventViewSet)

my_patterns = [
    url(r'^events/list/$',
        EventListView.as_view(),
        name='events-by-id'),
    url(r'^', include(router.urls)),
]

urlpatterns = [
    url(r'^$', RedirectView.as_view(url='/v1/')),
    url(r'^v1/$', schema_view),
    url(r'^v1/', include(my_patterns)),
]`

目标是发出类似curl -X GET --header 'Accept: application/json' --header 'Api-Key: {{ key }}' 'http://api.foo.com/v1/events/list/?ids=1,2,3,4,5'的GET请求,但目前正在返回{"detail":"Not found."}响应

没有参数的curl -X GET --header 'Accept: application/json' --header 'Api-Key: {{ key }}' 'http://api.foo.com/v1/events/list/'请求返回未过滤的查询集

1 个答案:

答案 0 :(得分:0)

解决了该问题,只需要在方法中定义查询集,并且较早定义它是错误的。一旦我重新绘制queryset = Event.objects.all(),视图和网址路由便会正常工作

class EventListView(generics.ListAPIView):
    serializer_class = EventSerializer

    def get_queryset(self):
        ids = self.request.query_params.get('ids', None)
        if ids is not None:
            ids = [ int(x) for x in ids.split(',') ]
            queryset = Event.objects.filter(pk__in=ids)

        else:
            queryset = Event.objects.all()[0:10]

        return queryset