【问题标题】:correct DRF filter list view endpoint to return multiple objects by id正确的 DRF 过滤器列表视图端点以通过 id 返回多个对象
【发布时间】:2019-04-16 17:52:00
【问题描述】:

我希望能够通过带有 GET 请求的 url 参数在单个 DRF 请求中按 id 请求多个 db 对象。我阅读了this stackoverflow post 和 DRF 在filtering against query parameters 上的文档,并认为我了解如何实施,但我的解决方案有点偏离。它将返回一个响应,但不过滤查询集(多个 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/' 请求返回未过滤的查询集

【问题讨论】:

  • 不相关但在基于类的视图中,您应该将permission_classes 定义为类的属性,而不是装饰器。 permission_classes =[HasAPIAccess, HasUnrestrictedAPIAccess]
  • 谢谢,很高兴知道

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


【解决方案1】:

解决了这个问题,只需要在方法中定义查询集,之前定义是错误的。一旦我删除了queryset = Event.objects.all(),视图和 url 路由就可以正常工作

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

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2013-08-20
    • 2018-05-08
    • 2020-01-26
    • 2021-10-20
    • 2018-01-17
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多