在带有多个参数的Django中过滤查询

时间:2020-09-27 20:19:06

标签: django django-rest-framework django-views

是否可以更有效地过滤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

1 个答案:

答案 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')
        )
相关问题