首页 > 解决方案 > 接受多个值的端点,包括查询字符串

问题描述

我有一个视图,它应该接受一个带有查询参数的端点,也可以不接受一个参数。

http://localhost:8001/v1/subjects?owner_ids=62,144

http://localhost:8001/v1/subjects

这是我的视图文件...

class SubjectPagination(JsonApiPageNumberPagination):
    """
    Required for frontend to retrieve full list.
    """
    max_page_size = 5000


class SubjectViewSet(Subject.get_viewset()):
    pagination_class = SubjectPagination

    def get_queryset(self):
        import pdb; pdb.set_trace()
        queryset = Subject.objects.all()

        if self.request.GET['owner_ids']:
            owner_id_list = self.request.GET['owner_ids'].split(',')
            owner_id_list_integer = []

            for i in owner_id_list:
                owner_id_list_integer.append(int(i))

            return queryset.filter(organization__in=owner_id_list_integer)

        else:

            return queryset


SubjectUserRoleViewSet = Subject.get_by_user_role_viewset(
    SubjectViewSet, GroupRoleMap, Role)

我想弄清楚如何处理两个端点?请建议在视图中需要做什么来处理带有或不带有查询字符串的 URI?

这是 urls.py

router.register(r'subjects', views.SubjectViewSet)

标签: djangodjango-rest-framework

解决方案


首先,在 url-form-encode 中发送参数是一个很好的做法,避免这样的事情,在这种情况下,对于发送列表,您可以将 id 发送为:

?owner_ids[]=62&owner_ids[]=144

查询字典将是这样的:

<QueryDict: {'owner_ids[]': ['62', '144']}>

你可以很容易地处理它,像这样

self.request.GET.getlist('owner_ids[]', [])

记得使用请求方法 GET 和 POST 的 get 和 get list 函数,以避免 dict 错误。

其次,split 返回一个列表,所有者列表 id 中的 for 语句是完全没有必要的,而 queryset 语句 __in 接受字符串数组,如果您真的想将所有项目转换为整数,请使用列表推导。例如,要将列表中的所有项目转换为整数,只需使用:

owner_ids = [int(i) for i in owner_ids ]

这在 python 中速度更快,更 Pythonic,也很酷。

最后,所有 url 都应该在 / 中结束,即使 django 也有一个名为 append_slash的设置

这就是我可以告诉你的模棱两可的问题,在接下来的时间里,请更准确地写出可以帮助人们帮助你的问题。


推荐阅读