samedi 21 septembre 2019

Conditional filtering in SQLAlchemy

I have this monster of a if statement that I use to filter results from database, but it begs to be refactored, is there any way to make filter queries conditional on variable? I need to return recipe belonging to every category/cuisine if it has ID of "1" which is all in my DB.

if ingredients_form and any_ingredients == "1":
    if category_form == "1" and cuisine_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form))
            ).all()
    elif category_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)),
            Recipe.category_id==category_form
            ).all()
    elif cuisine_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)),
            Recipe.cuisine_id==cuisine_form
            ).all()
    else:
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)), 
            Recipe.category_id==category_form,
            Recipe.cuisine_id==cuisine_form
            ).all()

elif ingredients_form and any_ingredients == "2":
    if category_form == "1" and cuisine_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form))
            ).all()
    elif category_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)),
            Recipe.category_id==category_form
            ).all()
    elif cuisine_form == "1":
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)),
            Recipe.cuisine_id==cuisine_form
            ).all()
    else:
        search_result2 = Recipe.query.filter(
            Recipe._ingredients.any(Ingredient.id.in_(ingredients_form)),
            ~Recipe._allergens.any(Allergen.id.in_(allergens_form)), 
            Recipe.category_id==category_form,
            Recipe.cuisine_id==cuisine_form
            ).all()

Aucun commentaire:

Enregistrer un commentaire