python - programmation - django tutorial français
Diminuer le nombre de blocs elif (2)
Que diriez-vous de créer une fonction comme
def q(**kwargs):
for k in kwargs:
if kwargs[k] == 'true':
kwargs[k] = True
return queryset.filter(**kwargs)
Vous avez juste besoin de mapper sun_side_window
à side_window
quelque sorte, ou l'enlever.
J'essaie de faire un filtre basé sur les queryparams
suivants.
Comment puis-je diminuer les lignes de 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)
Je suppose que par 'true'.capitalize()
, vous voulez dire la valeur booléenne True
, et non la chaîne 'True'
D'abord, convertissez 'true'
en True
. Ensuite, créez un dictionnaire qui contient les arguments de mot clé à transmettre à queryset.filter
. Je fais ces deux étapes dans une seule compréhension du dictionnaire:
vars = {'fridge': fridge, 'toilet': toilet, 'side_window': side_window}
kwargs = {kw: True for kw in vars if vars[kw] == 'true'}
Si vous n'êtes pas familier avec les compréhensions, cela équivaut à:
kwargs = {}
for kw in vars:
if vars[kw] == 'true':
kwargs[vars] = True
Déballez ensuite ce dictionnaire et transmettez-le à queryset.filter
:
queryset = queryset.filter(**kwargs)
Le déballage du dictionnaire équivaut à passer ses paires clé / valeur en tant qu'arguments de la fonction.
f(a=1, b=2)
# is equivalent to
kw = {'a': 1, 'b': 2}
f(**kw)
En remarque, je ne connais pas de queryset
, mais ça ressemble à un module. Si oui, je ne suggérerais pas de réaffecter le résultat de queryset.filter
à queryset
...