django conditionally filtering objects

前端 未结 5 961
野的像风
野的像风 2020-12-29 20:16

I would like to retrieve a bunch of rows from my database using a set of filters.

I was wondering if conditional filter is applicable in django. That is, \"filter if

5条回答
  •  天涯浪人
    2020-12-29 20:43

    To continue on @iuysal answer:

    To make it generic you need to pass the key too as parameter, to do that you need to pass a dictionary, here's how I did it:

    Create your dictionary like this:

    filters = {'filter1': 'value1', 'filter2__startswith': 'valu', ...}
    

    Then pass it to your Item filters like this:

    Item.objects.filter(*[Q(**{k: v}) for k, v in filters.items() if v], filter3='value3')
    

    The first version less cryptic version I had:

    def _filter(filters):
        filters = []
        for k, v in n.items():
            if v:
                filters.append(Q(**{k: v}))
        return filters
    
    filters = _filter({'name': name})
    return Item.objects.filter(*filters)
    

    Unpacking explanation: We want to give Q (queries) as args to objects.filter as args while we want to give kwargs to Q()

    I have this on production now (I will just modify the filters names because it's sensitive):

    def get_queryset(self):
        filter1 = self.request.GET.get('filter1 ', '')
        filter2__startswith = self.request.GET.get('filter2_prefix ', '')
    
        def filters_to_Qs(filters):
            return [Q(**{k: v}) for k, v in filters.items() if v]
    
        filters = {'filter1': filter1 ,
                   'filter2__startswith': filter2__startswith }
    
        return Order.objects.filter(*filters_to_Qs(filters))
    

提交回复
热议问题