我有一个视图,该视图应该接受带有查询参数以及没有参数的端点。
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)
答案 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进行了设置
这就是我所要问的模棱两可问题的答案,下次请写出更准确的问题,以帮助人们为您提供帮助。