Django-fr

Forum

#1 22-07-2014 11:30:43

vache67
Membre
Inscription : 27-11-2012
Messages : 12

appeler une fonction dans un model

Bonjour,

j'ai 2 modèles, Periode et Utilisateur. Dans Utilisateur, j'aimerai pouvoir récupérer dans la fonction Personne.finValidite les Periodes qui sont actuellement valides.

Je ne sais pas trop comment m'y prendre, quelqu'un peu m'aider svp ?

Voilà les bouts de models :

class Periode(models.Model):
    """
    Dates de début et durée en mois
    """
    nom =                               models.CharField(max_length=50, verbose_name="nom")
    dateDebut =                         models.DateField(verbose_name="date de début", default=datetime.now())
    duree =                             models.IntegerField(max_length=10, verbose_name="durée en mois",
                                                            default=12,
                                                            validators=[
                                                                MaxValueValidator(12*10),
                                                                MinValueValidator(1)
                                                            ])

    def dateFin(self):
        return (self.dateDebut + relativedelta(months=self.duree)).strftime("%d-%m-%y")        

    def __unicode__(self):
        return u"%s [du %s au %s] (%s mois)" % (self.nom, self.dateDebut.strftime("%d-%m-%y"), self.dateFin() , self.duree)



class Utilisateur(models.Model):
    personne =                          models.OneToOneField(Personne, verbose_name="personne")
    user =                              models.OneToOneField(User, verbose_name="compte Utilisateur")
    dateEnregistrement =                models.DateField(auto_now_add=True, verbose_name="date de l'enregistrement")
    periodes =                          models.ManyToManyField(Periode, verbose_name="périodes d'inscription")

    def finValidite(self):
        p = self.periodes
        print p

Merci

Dernière modification par vache67 (22-07-2014 11:32:22)

Hors ligne

#2 22-07-2014 20:34:53

vache67
Membre
Inscription : 27-11-2012
Messages : 12

Re : appeler une fonction dans un model

J'ai un peu avancé depuis... mais je rencontre un autre problème...

Est il possible de faire appel à des property depuis un xxx.objects.filter ??

Hors ligne

#3 23-07-2014 23:47:15

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : appeler une fonction dans un model

Pour pouvoir t'aider, il nous faut le problème, plutôt que la solution que tu essaies d'implémenter.

Hors ligne

#4 24-07-2014 18:46:33

vache67
Membre
Inscription : 27-11-2012
Messages : 12

Re : appeler une fonction dans un model

ok,

j'ai ça :

class Periode(models.Model):
    """
    Dates de début et durée
    """
    nom =                               models.CharField(max_length=50, verbose_name="nom")
    dateDebut =                         models.DateField(verbose_name="date de début", default=datetime.now())
    duree =                             models.IntegerField(max_length=10, verbose_name="durée en mois",
                                                            default=12,
                                                            validators=[
                                                                MaxValueValidator(12*10),
                                                                MinValueValidator(1)
                                                            ])

    def _dateFin(self):
        return self.dateDebut + relativedelta(months=self.duree)
    dateFin = property(_dateFin)

    def _estValideActuellement(self):
        return self.dateDebut <= datetime.now().date() <= self.dateFin
    estValideActuellement = property(_estValideActuellement)
        
.......

class Utilisateur(models.Model):
    personne =                          models.OneToOneField(Personne, verbose_name="personne")
    user =                              models.OneToOneField(User, verbose_name="compte Utilisateur")
    dateEnregistrement =                models.DateField(auto_now_add=True, verbose_name="date de l'enregistrement")
    periodes =                          models.ManyToManyField(Periode, verbose_name="périodes d'inscription")

    def _estValide(self):
        p = Periode.objects.filter(estValideActuellement=True) <--- problème ici

p = Periode.objects.filter(estValideActuellement=True) ne fonctionne pas... il me dit qu'il est possible de faire un filter que nom , dateDebut et duree

Ya t'il sinon, a part en faisant des boucles partout, moyen de savoir ici, dans Utilisateur, si au moins une des périodes attribuées sont actuellement valides

Pourtant j'ai ajouté la propriété dateFin.....

Dernière modification par vache67 (24-07-2014 18:48:51)

Hors ligne

#5 28-07-2014 06:45:26

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : appeler une fonction dans un model

C'est normal que cela ne fonctionne pas. Le filter construit une requête en SQL alors que la propriété est coté Python.

Hors ligne

#6 28-07-2014 19:11:34

vache67
Membre
Inscription : 27-11-2012
Messages : 12

Re : appeler une fonction dans un model

Ha ben oui, j'avais remarqué que ça fonctionne pas...

Ca valait le coup de me faire poser ma question autrement pour pas y répondre...

Dernière modification par vache67 (28-07-2014 19:13:48)

Hors ligne

#7 06-08-2014 10:17:21

EthPyth
Membre
Inscription : 22-08-2013
Messages : 7

Re : appeler une fonction dans un model

Vache67 Peut être regarder du côté des models manager?
https://docs.djangoproject.com/en/1.6/t … /#managers

Hors ligne

#8 08-08-2014 09:36:03

vache67
Membre
Inscription : 27-11-2012
Messages : 12

Re : appeler une fonction dans un model

C'est assez intéressant, ça permettrait effectivement d'implanter la fonctionnalité que je cherche. Mais il faudrait que j'écrive tout aussi. (ce que j'ai fait autrement maintenant). . C'est bizarre qu'il n'y ait rien de déjà fait pour ça.

Hors ligne

Pied de page des forums