是否可以更有效地过滤Django中具有多个可选参数的查询集?
例如我有产品列表,用户可以使用多个GET参数对其进行过滤。在这种情况下有6个参数。谢谢。
class ProductList(ListAPIView):
permission_classes = (IsAdminUser,)
serializer_class = ProductSerializer
def get_queryset(self):
queryset = Product.objects.order_by('-created_at')
category_id = self.request.GET.get('category_id')
color = self.request.GET.get('color')
size = self.request.GET.get('size')
status = self.request.GET.get('status')
date_from = self.request.GET.get('date_from')
date_to = self.request.GET.get('date_to')
if category_id:
queryset = queryset.filter(category_id=category_id)
if color:
queryset = queryset.filter(color=color)
if size:
queryset = queryset.filter(size=size)
if status:
queryset = queryset.filter(status=sistatusze)
if date_from:
queryset = queryset.filter(created_at__gte=date_from)
if date_to:
queryset = queryset.filter(created_at__lte=date_to)
return queryset
答案 0 :(得分:1)
您可以创建一个实用函数,该函数不会过滤值为None
的条件:
def filter_if_not_none(qs, **kwargs):
return qs.filter(**{k: v for k, v in kwargs.items() if v is not None})
然后我们可以将该实用程序用作:
class ProductList(ListAPIView):
permission_classes = (IsAdminUser,)
serializer_class = ProblemSerializer
def get_queryset(self):
queryset = Product.objects.order_by('-created_at')
return filter_qs_if_not_none(
queryset,
category_id=self.request.GET.get('category_id')
color=self.request.GET.get('color')
size=self.request.GET.get('size')
status=self.request.GET.get('status')
created_at__gte=self.request.GET.get('date_from')
created_at__lte=self.request.GET.get('date_to')
)