【发布时间】:2019-08-01 02:04:00
【问题描述】:
我将Django rest framework 用于我的 REST API。我有一些用于过滤的参数的端点,如下所示:
# in my view
from_date = self.request.query_params.get('from', None)
to_date = self.request.query_params.get('to', None)
category = self.request.query_params.get('category', None)
color = self.request.query_params.get('color', None)
然后我在选择数据的地方有 if/else 代码。第一次只有两个参数所以没问题,但后来我添加了更多参数进行过滤,现在我认为这段代码看起来不太好,我认为需要进行一些优化。此外,不同参数的组合现在不起作用。
实际代码(在我看来):
if from_date is not None and to_date is not None:
something = Something.objects.filter(send_date__range=(from_date, to_date))
elif category:
something = Something.objects.filter(values__something__category__name__iexact=category)
elif color:
something = Something.objects.filter(values__something__color__name__iexact=color)
else:
something = Something.objects.all()
是否有任何选项,内置于 DRF 或 Django 中的某种类型的组合过滤,考虑到值可以为无,我如何将参数组合成一个大查询?
例如,如果用户使用日期发送 from_date 和 to_date 查询过滤数据。但用户也希望使用 from_date、to_date 和 color 或其他参数组合过滤数据。有些参数可以省略。该代码只是最小版本。我有更多参数,我不想为每个参数组合编写 if 和 else。
类似的东西(但如果其中一个值为 None 则没有此值查询将起作用):
Something.objects.filter(send_date__range=(from_date, to_date))
.filter(values__something__category__name__iexact=category)
.filter(values__something__color__name__iexact=color)
【问题讨论】:
-
例如,如果 from_date 和 to_date 为 None,那么您要为查询提供什么默认值?或者您到底希望查询做什么?
-
我会扩展我的问题。给我一分钟
-
好的,添加了一些信息。我不想为每个参数组合编写 if/else,因为用户可以使用日期和颜色或仅使用颜色、颜色和类别等过滤数据
-
just gona 推荐 django 过滤器 (django-filter.readthedocs.io/en/master),它是 django 中过滤的一个疯狂的综合解决方案,并且可以与 DRF 轻松集成
-
我也有同样的想法,使用 django-filters,但如果有其他更简单的解决方案,我就陷入了沉思。
标签: django django-rest-framework django-filter