如何使用 django-filters 过滤 ModelViewSet 中的自定义 url
Posted
技术标签:
【中文标题】如何使用 django-filters 过滤 ModelViewSet 中的自定义 url【英文标题】:How to filter custom urls in ModelViewSet with django-filters 【发布时间】:2022-01-23 18:22:11 【问题描述】:class ExportTabView(ModelViewSet):
permission_classes = [UserHasDatasetChangeAccess]
queryset = JobTable.objects.all()
filterset_fields = [
"job_type",
"action",
"source_table__name",
"source_table__type",
]
ordering_fields = ["created_on", "modified_on"]
ordering = ["-modified_on"]
我可以使用带有上述 api 的 django 过滤器:
/api/export-tab-view?source_table__name='temp'
但在此模型视图集中添加自定义 url 后,我无法使用 django 过滤器。
class ExportTabView(ModelViewSet):
serializer_class = ExportTabSerializer
permission_classes = [UserHasDatasetChangeAccess]
queryset = JobTable.objects.all()
filterset_fields = [
"job_type",
"action",
"source_table__name",
"source_table__type",
]
ordering_fields = ["created_on", "modified_on"]
ordering = ["-modified_on"]
@action(detail=False)
def export_dataset(self, request, id=None):
"""
Returns a list of all the relationship names that the given
dataset has
"""
jobs = JobTable.objects.filter(
dataset=get_object_or_404(DataSet, id=self.request.META.get(DATASET_ID, ""))
)
return Response(ExportTabSerializer(jobs, many=True).data)
现在我调用 api 时过滤器不起作用
/api/export-tab-view/export_dataset?source_table__name='temp'
【问题讨论】:
【参考方案1】:您可以通过这样做来过滤数据集,但这取决于您要查询的 DataSet 对象的哪个字段!我猜你是否想假设字段名称对 DataSet 模型进行查询集 是数据集,像这样将其提供给过滤器:
@action(detail=False)
def export_dataset(self, request, id=None):
"""
Returns a list of all the relationship names that the given
dataset has
"""
dataset=get_object_or_404(DataSet id=self.request.META.get(DATASET_ID, ""), **dict(request.query_params.items()))
jobs = JobTable.objects.filter(dataset=dataset)
return Response(ExportTabSerializer(jobs, many=True).data)
【讨论】:
【参考方案2】:我已经这样做了,现在它工作正常。
@action(detail=False)
def export_dataset(self, request, id=None):
"""
Returns a list of all the relationship names that the given
dataset has
"""
jobs = JobTable.objects.filter(
dataset=get_object_or_404(DataSet, id=self.request.META.get(DATASET_ID, "")),
**dict(request.query_params.items()))
return Response(ExportTabSerializer(jobs, many=True).data)
【讨论】:
如果它对您有用,请将其标记为已接受的答案,以便它也有助于他人受益。 我无法接受自己的答案。 您至少可以将其标记为已接受的答案,而不是投票给您的答案 2天后才能接受以上是关于如何使用 django-filters 过滤 ModelViewSet 中的自定义 url的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django-filters 过滤 ModelViewSet 中的自定义 url
Django-Filter 包:如何过滤对象以创建统计信息而不是列表