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 ...







query-optimization