我希望能够通过带有GET请求的url参数在单个DRF请求中通过id请求多个db对象。我通读了this stackoverflow post和filtering 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/'
请求返回未过滤的查询集
答案 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