Utilisation du décorateur @classmethod
Bonsoir,
Je ne l'ai jamais utilisé jusque présent (@classmethod).
Est-ce que dans mon cas il est bien utilisé ?
Ou c'est inutile de mettre le décorateur ? Sachant que quand j'appelle ma méthode dans le projet ça fonctionne qu'il y soit ou pas.
Merci d'avance
class Order(models.Model):
# c'est ce qui va être dans le panier
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
# un utilisateur peut avoir plusieurs "Order"
user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
ordered_date = models.DateTimeField(blank=True, null=True)
def __str__(self):
return f"{self.ticket.name}, {self.quantity}"
@classmethod
def total(cls, user):
total = 0
orders_in_cart = Order.objects.filter(user=user, ordered=False)
for order in orders_in_cart:
total += order.ticket.price * order.quantity
return f"{total}"
Lien vers mon repo : https://github.com/gabigab117/R-servations-de-places-de-concerts.git
Dans votre cas, l'utilisation du décorateur @classmethod n'est pas nécessaire car votre méthode total n'utilise pas les attributs de la classe Order et n'a pas besoin d'être dynamique par rapport aux instances de la classe.
Le décorateur @classmethod est généralement utilisé pour définir une méthode qui opère sur la classe elle-même plutôt que sur une instance particulière de la classe. Par exemple, si vous aviez besoin d'une méthode qui retourne le nombre total d'objets Order créés jusqu'à présent dans votre application, vous pourriez utiliser @classmethod :
class Order(models.Model):
# ...
@classmethod
def total_orders(cls):
return cls.objects.count()
Dans ce cas, la méthode total_orders utilise l'objet de classe cls pour accéder au gestionnaire d'objets objects de la classe Order, ce qui permet de déterminer le nombre total d'objets Order créés dans l'application.
Dans votre méthode total, vous utilisez simplement le gestionnaire d'objets Order.objects.filter pour récupérer une liste d'objets Order, puis vous parcourez cette liste pour calculer le total. Vous pourriez faire la même chose sans utiliser @classmethod, simplement en appelant Order.objects.filter directement dans votre vue ou votre programme principal.
En résumé, si votre méthode ne dépend pas de l'état de la classe ou de ses instances, il n'est pas nécessaire d'utiliser @classmethod.
Hello Gab,
la réponse de l'IA est très bien. Dis moi si ça répond à ta question. Mais effectivement la manière dont tu as utilsé la classmethod n'est peut être pas la manière la plus approriée car dans ta méthode tu n'accèdes jamais à la classe elle mêmes avec le cls. tu vas plutot chercher les objets en utilisant le getsionnaire d'objet comme l'IA le dit.
Slt PA !
Oui du coup je n'avais pas mis à jour mon post. Je m'étais rendu compte de l'inutilité de la classmethod.
A la place j'avais fait ça :
class Order(models.Model):
# c'est ce qui va être dans le panier
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
# un utilisateur peut avoir plusieurs "Order"
user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
ordered_date = models.DateTimeField(blank=True, null=True)
def __str__(self):
return f"{self.ticket.name}, {self.quantity}"
@staticmethod
def total(user):
total = 0
orders_in_cart = Order.objects.filter(user=user, ordered=False)
for order in orders_in_cart:
total += order.ticket.price * order.quantity
return total
Une méthode statique. ça me parait plus logique ?
Bien qu'au final j'aurais pu le faire avec une méthode d'instance lol.
Merci ^^
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte