IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Exécution d'une fonction au chargement d'un objects.get


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Par défaut Exécution d'une fonction au chargement d'un objects.get
    Bonjour à tous,

    J'ai une question concernant l'exécution d'une fonction au chargmenet d'un "objects.get" ou d'un "objects.filter".
    Je m'explique. Je m'amuse à développer une petite application web avec django.

    Pour faire simple, j'ai une classe compte décrite comme ci-dessous dans mon models.py avec une fonction qui permet de calcul le solde du compte à partir des opérations saisies (une autre classe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Compte(models.Model):
        libelle = models.CharField(max_length=200,blank=True)
        ....
        onArchive = models.BooleanField(default=False,blank=True)
        soldes = {}
     
        def __str__(self) -> str:
            return self.libelle
     
        def fn_get_soldes(self):
            # on va récupérer les soldes depuis les opérations associées
            OperationsDebit = Operation.objects.filter(typeOperation='D',compte_id=self.pk).aggregate(Sum('montant'))
            if OperationsDebit['montant__sum'] == None:
                OperationsDebit['montant__sum'] = 0.00
            OperationsCredit = Operation.objects.filter(typeOperation='C',compte_id=self.pk).aggregate(Sum('montant'))
            if OperationsCredit['montant__sum'] == None:
                OperationsCredit['montant__sum'] = 0.00
     
            self.soldes = {
                "soldeInitial" : self.soldeInitial,
                "soldePointe" : OperationsCredit['montant__sum'] - OperationsDebit['montant__sum'] + self.soldeInitial,
            }
    Dans mon fichier views.py, si je veux afficher le détails d'un compte sur ma page, j'ai ce code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def compte_details(request,id):
        compte = Compte.objects.get(pk=id)
        compte.fn_get_soldes()
    Ca fonctionne très bien. Mais la ou ça ne me plait pas, c'est que je veux faire une page avec tous les comptes. Mais la, ça marche plus car je ne peux utiliser ma fonction sur une liste d'objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def comptes(request):
        comptes = Compte.objects.filter(onArchive=False)
    Je pourrais m'en sortir en bouclant sur la liste d'objets et pour chaque compte le mettre à jour. Ca fonctionnerait également. Mais je voudrais savoir s'il est possible d'exécuter cette fonction fn_get_soldes au moment ou l'objet est peuplé depuis la base?

    J'espère être assez claire et désolé si je n'utilise pas les bons termes...

    En vous remerciant pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par keitaro_bzh Voir le message
    Mais je voudrais savoir s'il est possible d'exécuter cette fonction fn_get_soldes au moment ou l'objet est peuplé depuis la base?
    Ce "peuplement" ne se fait pas auto-magiquement mais sera le résultat de l'exécution d'une instruction dans le code que vous avez écrit.
    A cet endroit, on pourra appeler ce qu'on veut avant ou après.
    Morale: soyez plus clair...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre très actif Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Morale: soyez plus clair...
    Je me base sur cette ligne qui fait de la "magie"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compte = Compte.objects.get(pk=id)
    Elle va chercher les données dans la base et implémenter mon objet avec les données récupérées pour l'id en question. La question est de savoir si je peux surcharger cette fonction pour exécuter ma fonction fn_get_soldes en même temps. Comme si j'avais une fonction du type "charge_base_id" (exemple foireux non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Compte(models.Model)
       libelle = models.CharField(max_length=200,blank=True)
       soldes = {}
     
       def __str__(self) -> str:
            return self.libelle
     
      def fn_get_soldes(self):
          #code récupérant les soldes
     
       def charge_base_id(self,idParam)
          self = Compte.objects.get(pk=idParam)
          self.fn_get_soldes()
    Ainsi dès qu'une récupération d'un objet dans la base se fait, les soldes sont automatiquement calculés

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par keitaro_bzh Voir le message
    La question est de savoir si je peux surcharger cette fonction pour exécuter ma fonction fn_get_soldes en même temps.
    Si j'ai compris la question, ça devrait se faire avec des Customs Managers.... mais ce n'est peut être pas la meilleure façon de...
    Après, c'est plutôt de la programmation avancée... et je ne vais pas chercher des exemples sur Internet.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bonjour,

    Si la méthode en question permet de modifier des champs en fonction de l'objet créé, alors on pourrait peut-être utiliser la méthode bulk_update.

    Si elle ne convient pas, alors effectivement le custom Manager pour créer sa propre requête est une excellente idée, voir la seule à mon sens !

  6. #6
    Membre très actif Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Par défaut
    Merci pour vos réponses.

    A la lecture du custom Manager, cela me semble pas mal. à creuser de ce coté la.

Discussions similaires

  1. [Débutant] Exécution d'une fonction au chargement d'une autre fenêtre
    Par bourinatore dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/09/2015, 00h24
  2. Exécuter une fonction au chargement
    Par thais781 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/12/2013, 14h33
  3. Exécuter une fonction au chargement d'une JSP
    Par mac&cheese dans le forum Struts 1
    Réponses: 5
    Dernier message: 07/03/2011, 18h15
  4. excuter une fonction au chargement d'une page
    Par xess91 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/12/2009, 20h11
  5. [Prototype] Exécution d'une fonction à la fin du chargement de la page
    Par Herman dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 30/12/2008, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo