Django : Optimiser avec l'objet F
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 :)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte