为什么 Django REST Framework 路由器会破坏查询参数过滤?

时间:2021-06-05 13:04:12

标签: django django-rest-framework django-rest-framework-filters

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 时不会应用过滤器。

我希望在端点列表中包含视图集,但同时能够使用查询参数进行过滤。我该怎么做?

1 个答案:

答案 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
相关问题