Résolue

Est-ce que j'ai bien fait ?

# Correction de code # Django

Gabriel Trouvé

Mentor

Bonsoir,


Je pense que j'ai bien fait car j'ai le même résultat que dans ta vidéo.


En fait les modèles Cart et Order ne sont pas les mêmes quand la vidéo "compléter la transaction". Car en cours de route on avait fait une modif "Modifier les modèles Order et Cart".


Du coup au lieu de faire :


j'ai modifié la fonction complete_order


def complete_order(data):
    try:
        user_email = data['customer_details']['email']
    except KeyError:
        return HttpResponse("Invalid user email", status=404)

    user = get_object_or_404(Shopper, email=user_email)
    user.cart.delete()
    # 200 pour indiquer que le paiement a été procéssé correctement
return HttpResponse(status=200)

Car on avait surchargé la méthode delete du modèle Cart :


class Cart(models.Model):
    # one to one car l'utilisateur ne peut avoir qu'un seul panier. Si j'utilise Foreign als unique=True
    user = models.OneToOneField(AUTH_USER_MODEL, on_delete=models.CASCADE)
    # plusieurs articles peuvent être ajoutés donc ManytoMany
    orders = models.ManyToManyField(Order)

    def __str__(self):
        return self.user.username

    def delete(self, *args, **kwargs):
        for order in self.orders.all():
            order.ordered = True
            order.ordered_date = timezone.now()
            order.save()

        # je détache les articles de mon panier avec clear
        self.orders.clear()

        super().delete(*args, **kwargs)


Au final j'ai le même résultat que dans la vidéo.


Donc je pense que se servir de la méthode delete de Cart était la meilleure solution ?


Merci

Salut Gab!

Il semble en effet que la surcharge de la méthode delete du modèle Cart est une bonne solution dans ce cas précis, car cela permet de marquer tous les articles du panier comme étant commandés et d'effacer tous les articles du panier en une seule opération.


Cependant, attention, il est important de noter que cela peut avoir des conséquences imprévues dans d'autres parties de ton code où la méthode delete est utilisée, donc il convient d'être prudent dans l'utilisation de cette technique.


En tout cas, c'est cool d'avoir réussi à obtenir le même résultat que dans la vidéo bravo!

Gabriel Trouvé

Mentor

Merci ! :) J'ai ré adapté le code pour avoir le résultat mais oui je dois faire gaffe quand j'appelerai le delete . ^^

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.