端点接受多个值,包括查询字符串

时间:2019-06-11 18:56:54

标签: django django-rest-framework

我有一个视图,该视图应该接受带有查询参数以及没有参数的端点。

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)

1 个答案:

答案 0 :(得分:1)

首先,以url-form-encode发送参数是一种好习惯,避免类似的事情,在这种情况下,要发送列表,您可以将id发送为:

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

querydict将会像这样:

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

您可以像这样轻松地处理它

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

请记住使用请求方法GET和POST的get和get列表功能,以避免dict错误。

第二,split完全不需要所有者列表id中的for语句,如果您实际上想使用列表推导将所有项目转换为整数,则queryset语句__in接受字符串数组。例如,要将列表中的所有项目转换为整数,只需使用:

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

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

最后,所有url应该以/结尾,即使django对此called append_slash进行了设置

这就是我所要问的模棱两可问题的答案,下次请写出更准确的问题,以帮助人们为您提供帮助。