django - 接受多个值的端点,包括查询字符串
问题描述
我有一个视图,它应该接受一个带有查询参数的端点,也可以不接受一个参数。
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)
解决方案
首先,在 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的设置
这就是我可以告诉你的模棱两可的问题,在接下来的时间里,请更准确地写出可以帮助人们帮助你的问题。
推荐阅读
- c++ - 是否可以将未知类型的变量声明为类成员变量?
- c# - 如何在变量声明 (CS0270) 中强制执行数组的长度?
- java - 在 Android Studio 中使用 Java 添加自定义货币
- python - 如何使用多层感知器并在给定倾斜分布特征的情况下进行预测
- atom-editor - 我总是以 Atom 中的混合行尾结尾
- python-3.x - 错误:redirect_uri_mismatch pydrive
- java - Java:获取输入整数数组的最有效方法
- html - 在移动设备上禁用视差效果的 CSS 技巧
- json - 嵌套的 JSON golang 映射
- ruby-on-rails - 带有 Rails 的 GraphQL gem,似乎找不到正确的类型定义?