在 Django REST Framework Tutorial quickstart 中,视图被添加到默认路由器:
// project/urls.py
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
我的项目布局是
project/
stuffs/
我在默认路由器中包含了 stuffs 应用程序:
router.register(r'stuffs', views.StuffViewSet)
然后,stuffs/
端点很好地列在端点的 API 根列表中:
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"users": "http://localhost:8000/users/",
"groups": "http://localhost:8000/groups/",
"stuffs": "http://localhost:8000/stuffs/"
}
Stuff
对象与所有者模型类有关系,并过滤属于某个所有者的对象,我打算使用如下请求:
stuffs/?owner_id=abc
为了做到这一点,我不确定它是否正确,我在 urls.py
应用程序中引入了一个 stuffs
配置:
// stuffs/urls.py
urlpatterns = format_suffix_patterns([
path('stuffs/', stuffs_views.StuffList.as_view()),
path('stuffs/<int:pk>/', stuffs_views.StuffDetail.as_view()),
re_path(r'^stuffs/(?P<owner_id>.+)$', stuffs_views.StuffsList.as_view())
])
使用以下基于 StuffsList 类的视图:
class StuffList(generics.ListCreateAPIView):
serializer_class = StuffSerializer
def get_queryset(self):
queryset = Stuff.objects.all()
owner_id = self.request.query_params.get('owner_id')
if owner_id is not None:
queryset = queryset.filter(owner__owner_id=owner_id)
return queryset
我很确定这个视图是正确的,因为当我从默认路由器中删除视图集时,查询有效。
但是,当视图集在默认路由器中注册时,在请求 stuffs/?owner_id=abc
时不会应用过滤器。
我希望在端点列表中包含视图集,但同时能够使用查询参数进行过滤。我该怎么做?
答案 0 :(得分:0)
你为什么要尝试 short_id
?无论如何试试这个:
def get_queryset(self):
queryset = Stuff.objects.all()
owner_id = self.request.query_params.get('owner_id')
if owner_id is not None:
queryset = queryset.filter(owner__short_id=int(owner_id))
return queryset