Reduce the number of elif blocks

I am trying to make a filter based on the following queryparams .

How to reduce lines of code:

 if fridge == 'true' and toilet == 'true' and side_window == 'true': queryset = queryset.filter(toilet=True, fridge=True, sun_side_window=True) elif fridge == 'true' and toilet == 'true': queryset = queryset.filter(toilet=True, fridge=True) elif fridge == 'true' and side_window == 'true': queryset = queryset.filter(sun_side_window=side_window.capitalize(), fridge=fridge.capitalize()) elif toilet == 'true' and side_window == 'true': queryset = queryset.filter(sun_side_window=side_window.capitalize(), toilet=toilet.capitalize()) elif fridge == 'true': queryset = queryset.filter(fridge=fridge.capitalize()) elif toilet == 'true': queryset = queryset.filter(toilet=toilet.capitalize()) elif side_window == 'true': queryset = queryset.filter(sun_side_window=True) 
+5
source share
3 answers

I assume that by 'true'.capitalize() you mean the boolean value True , not the string 'True'

First convert 'True' to True . Then create a dictionary containing the keyword arguments that will be passed to queryset.filter . I take these two steps in one dictionary understanding:

 vars = {'fridge': fridge, 'toilet': toilet, 'side_window': side_window} kwargs = {kw: True for kw in vars if vars[kw] == 'true'} 

If you are not familiar with understanding, this is equivalent to:

 kwargs = {} for kw in vars: if vars[kw] == 'true': kwargs[vars] = True 

Then unzip this dictionary and pass it to queryset.filter :

 queryset = queryset.filter(**kwargs) 

Unpacking a dictionary is equivalent to passing it to key / value pairs as arguments to a function keyword.

 f(a=1, b=2) # is equivalent to kw = {'a': 1, 'b': 2} f(**kw) 

As a note, I don't know about queryset , but it looks like a module. If so, I would not suggest reassigning the result of queryset.filter to queryset ...

+4
source

How about creating a function like

 def q(**kwargs): for k in kwargs: if kwargs[k] == 'true': kwargs[k] = True return queryset.filter(**kwargs) 

You just need to somehow match sun_side_window to side_window or remove it.

0
source
 k = {} if fridge == "true": k["fridge"] = True if toilet == "true": k["toilet"] = True if side_window == "true": k["sun_side_window"] = True q = queryset.filter(**k) 
0
source

Source: https://habr.com/ru/post/1270056/


All Articles