Résolue

Django : Optimiser avec l'objet F

# Bases de données

Gabriel Trouvé

Mentor

Bonjour THibault !

Je pense que cette question a sa place ici, comme ça elle sera plus facile à retrouver que sur discord.

Question par rapport à l'objet F.
En fait si je comprends bien, il permet de réaliser directement les calculs en BDD ? Sans tout charger ?

Je ne suis pas sûr de comprendre à 100%. J'aurais besoin d'une explication à la Thibault ahah.

En tous cas j'ai réussi à faire ce que je voulais avec, c'est hyper pratique. Avec en plus la possibilité d'exclure des instances c'est juste énorme.

Merci d'avance :)

    @property 
    def total_price_night_options(self):
        total_price = self.options.exclude(option__name="Personne supplémentaire(nuit)").aggregate(
            total_price=Sum(F("option__price") * F("quantity"))
        )["total_price"] or 0

        try:
            person_option = self.options.get(option__name="Personne supplémentaire(nuit)")
            total_price += (person_option.option.price * person_option.quantity) * self.night_period
        except ObjectDoesNotExist:
            pass
        return total_price

Salut Gab !

C'est bien ça pour l'objet F ! C'est super puissant pour effectuer des calculs directement au niveau de la base de données, sans devoir charger les objets en mémoire dans Python :)

Ça te permet de bénéficier directement des performances de ton système de gestion de base de données.

La doc l'explique bien :

« Un objet F() représente la valeur d’un champ de modèle, la valeur transformée d’un champ de modèle ou une colonne annotée. Il permet de se référer à des valeurs de champs de modèles et d’effectuer avec elles des opérations en base de données sans avoir à les récupérer préalablement de la base de données vers la mémoire Python.

Au lieu de cela, Django utilise un objet F() pour générer une expression SQL qui décrit l’opération requise au niveau de la base de données. »

Quand tu fais Sum(F("option__price") * F("quantity")), Django génère donc une requête SQL qui effectue cette multiplication et la somme correspondante directement dans la base de données. Du coup, c'est beaucoup plus efficace, surtout quand tu as beaucoup d'enregistrements ou quand les calculs sont complexes, que de récupérer les valeurs au préalable sur l'instance et utiliser les opérateurs mathématiques standards de Python pour les manipuler :)

Gabriel Trouvé

Mentor

Ok super ! Je l'ai utilisé une fois, mais ça va être comme les requêtes Q ça va devenir un super ami ce F lol

Merci ! :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.