django - 我想使用 url 参数作为可选过滤器 django rest 框架
问题描述
我有一个 django rest 框架应用程序,我想使用我的 url 参数作为查询集的可选过滤,它们在 url 中给出。
现在,我正在尝试从 url 中获取参数并且它们没有获取,因此也没有将参数用作过滤器。
有人可以帮我解决这个问题。
网址:
router.register(r'preferences', PreferenceUserViewSet, basename='Preference')
router.register(r'preferences/(?P<namespace>\w+)', PreferenceUserViewSet, basename='Preference-namespace')
router.register(r'preferences/(?P<namespace>\w+)/(?P<path>\w+)', PreferenceUserViewSet, basename='Preference-path')
视图集:
class PreferenceUserViewSet(viewsets.ModelViewSet):
model = Preference
serializer_class = PreferenceSerializer
def get_permissions(self):
if self.action == 'create' or self.action == 'destroy':
permission_classes = [IsAuthenticated]
else:
permission_classes = [IsAdminUser]
return [permission() for permission in permission_classes]
@permission_classes((IsAuthenticated))
def get_queryset(self):
namespace = self.request.query_params.get('namespace', None)
path = self.request.query_params.get('path', None)
print(namespace)
print(path)
queryset = Preference.objects.filter(user_id=1)
if path is not None:
queryset = Preference.objects.filter(user_id=1, namespace=namespace)
if namespace is not None:
queryset = Preference.objects.filter(user_id=1, namespace=namespace, path=path)
return queryset
因此,如果没有传入名称空间或路径,我想仅基于 user_id 进行过滤。如果传入 namepsace 并且未传入路径,我想根据 user_id 和名称空间进行过滤。我想根据 user_id 和名称空间进行过滤和路径,如果所有三个值都传入了。我查看了所有文档,但我无法弄清楚。
解决方案
而不是self.request.query_params
,您应该self.kwargs
在您的get_queryset
方法中使用,因为namespace
andpath
不是查询参数,而是URL 的参数。
class PreferenceUserViewSet(...):
...
def get_queryset(self):
namespace = self.kwargs.get('namespace', None)
path = self.kwargs.get('path', None)
...
推荐阅读
- javascript - 最佳实践 JS API (json) 数据使用、“模型”或 JSON - 性能、可维护性、资源
- python - 从熊猫数据框中的列名中删除时间戳
- reactjs - Electron、React 和 WebSockets 导致 WebSocket.Server 不是构造函数
- c++ - 函数的返回值类型是别名***或***布尔值
- wordpress - 为自定义分类创建动态重写规则
- javascript - popunder javascript 出现 1 次,希望每次访问出现 3 次
- c++ - 我想从我的上下文弹出菜单中获得一个矩形
- python - 如何刷新代表 QSqlRelationalTablemodel 数据的组合框委托中的项目列表
- ios - 显示 Segue 未进入导航堆栈。View Controller 上没有出现后退按钮,并且从底部而不是左侧向上滑动
- javascript - 反应解析意外的令牌