Django-fr

Forum

#1 01-09-2014 09:04:37

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Utilisation de ForeignKey.to_field

Bonjour,

Dans mon appli je souhaite associer à un model la valeur d'un autre via un champ défini.
Plus concrètement j'ai un model définissant un client et je souhaite y lier un mode de règlement via le code de ce dernier.

Voici mon code :

class Reglement(models.Model):
    TYPE = models.CharField('Mode de Règlement', max_length=10, unique=True)
    LIB = models.CharField('Libellé', max_length=200)
    def /__str__/(self):
        return self.TYPE
    def /__str__/(self):
        return self.LIB

class Client(models.Model):
    REGLT = models.ForeignKey(Reglement, to_field="TYPE")


En lisant la doc je crois comprendre que c'est bien to_field qu'il faut utiliser (https://docs.djangoproject.com/fr/1.6/ref/models/fields/#foreignkey), mais malheureusment lorsque je veux créer un nouveau client ceux sont les différents LIB qui sortent et pas les TYPES.


Ai-je loupé quelque chose ?

D'avance merci pour votre aide.

Charlie

Hors ligne

#2 01-09-2014 09:58:50

F. D.V.
Membre
Inscription : 21-07-2016
Messages : 4

Re : Utilisation de ForeignKey.to_field

Salut,

Je vois plusieurs choses bizarres dans ton code :

Il y a 2 __str__ dans ta class Reglement.. le 2eme ne sera jamais exécuté,
d'ailleurs je crois qu'il vaut mieux utiliser __unicode__ à la place....

Tu ne devrais pas écrire le nom des attributs en majuscules (par convention)

Étant donné qu'il y aura plusieurs type de paiement, tu devrais faire une
class pour lui

J'ai refait ton code, très rapidement, sans le tester... :


class TypePaiement(models.Model):
    nom = models.CharField(max_length=10, unique=True)

    def __unicode__(self):
        return self.nom

class Reglement(models.Model):
    typePaiement = models.ForeignKey(TypePaiement)
    libelle = models.CharField(max_length=200)

    def __unicode__(self):
        return "%s (%s)" % (self.libelle, self.typePaiement.nom)

class Client(models.Model):
    reglement = models.ForeignKey(Reglement)



-------------------------------------------
François DE VAL
07 81 17 44 80
http://aliaz.com/francois-deval


Le 1 septembre 2014 10:04, Charlie Gentil <ceg _AT_ redaction-developpez.com> a
écrit :

>  Bonjour,
>
>
>
> Dans mon appli je souhaite associer à un model la valeur d'un autre via un
> champ défini.
>
> Plus concrètement j'ai un model définissant un client et je souhaite y
> lier un mode de règlement via le code de ce dernier.
>
>
>
> Voici mon code :
>
>
>
> class Reglement(models.Model):
>
> TYPE = models.CharField('Mode de Règlement', max_length=10, unique=True)
>
> LIB = models.CharField('Libellé', max_length=200)
>
> def __str__(self):
>
> return self.TYPE
>
> def __str__(self):
>
> return self.LIB
>
>
>
> class Client(models.Model):
>
> REGLT = models.ForeignKey(Reglement, to_field="TYPE")
>
>
>
>
>
> En lisant la doc je crois comprendre que c'est bien to_field qu'il faut
> utiliser (
> https://docs.djangoproject.com/fr/1.6/ref/models/fields/#foreignkey),
> mais malheureusment lorsque je veux créer un nouveau client ceux sont les
> différents LIB qui sortent et pas les TYPES.
>
>
>
>
>
> Ai-je loupé quelque chose ?
>
>
>
> D'avance merci pour votre aide.
>
>
>
> Charlie
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 01-09-2014 10:21:42

Damien Nicolas
Membre
Inscription : 16-09-2012
Messages : 4

Re : Utilisation de ForeignKey.to_field

On Mon, Sep 01, 2014 at 10:58:50AM +0200, F. D.V. wrote:
> Salut,
>
> Je vois plusieurs choses bizarres dans ton code :
>
> Il y a 2 __str__ dans ta class Reglement.. le 2eme ne sera jamais exécuté,
> d'ailleurs je crois qu'il vaut mieux utiliser __unicode__ à la place....

Tout dépend de la version de Python. En python3, les chaînes unicode étant des
objets String, c'est bien __str__ qui doit être utilisé pour Django.

Hors ligne

#4 01-09-2014 11:15:15

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Re : Utilisation de ForeignKey.to_field

Salut et merci pour ta réponse.
Concernant __str__ ou __unicode__, comme l'a dit Damien je travaille avec Python3 et c'est donc __str__ qui doit être utilisé.
Concernant le nombre de __str__ je n'ai pas assez fait de test pour me rendre compte si ça fonctionnait bien ou pas ... et en fait il semblerait que mon souci vienne tout simplement de là.

Par contre je ne comprends pas trop pourquoi tu veux que je refasse une classe TypePaiement... Il y aura effectivement plusieurs types de paiement, tout comme je vais avoir plusieurs nom, adresses, mail ... de clients. Je vais pas refaire une classe pour chaque car là ça risque de sacrément devenir compliqué... non ?

Merci de ton aide en tout cas.

++



Salut,

Je vois plusieurs choses bizarres dans ton code :






Étant donné qu'il y aura plusieurs type de paiement, tu devrais faire une class pour lui



J'ai refait ton code, très rapidement, sans le tester... :










-------------------------------------------
François DE VAL07 81 17 44 80
http://aliaz.com/francois-deval[1]



Le 1 septembre 2014 10:04, Charlie Gentil <ceg _AT_ redaction-developpez.com[2]> a écrit :


Bonjour,

Dans mon appli je souhaite associer à un model la valeur d'un autre via un champ défini.
Plus concrètement j'ai un model définissant un client et je souhaite y lier un mode de règlement via le code de ce dernier.

Voici mon code :

class Reglement(models.Model):
TYPE = models.CharField('Mode de Règlement', max_length=10, unique=True)
LIB = models.CharField('Libellé', max_length=200)
def /__str__/(self):
return self.TYPE
def /__str__/(self):
return self.LIB

class Client(models.Model):
REGLT = models.ForeignKey(Reglement, to_field="TYPE")


En lisant la doc je crois comprendre que c'est bien to_field qu'il faut utiliser (https://docs.djangoproject.com/fr/1.6/ref/models/fields/#foreignkey[3]), mais malheureusment lorsque je veux créer un nouveau client ceux sont les différents LIB qui sortent et pas les TYPES.


Ai-je loupé quelque chose ?

D'avance merci pour votre aide.

Charlie

django _AT_ lists.afpy.org[4]
http://lists.afpy.org/mailman/listinfo/django[5]






--------
[1] http://aliaz.com/francois-deval
[2] mailto:ceg _AT_ redaction-developpez.com
[3] https://docs.djangoproject.com/fr/1.6/ref/models/fields/#foreignkey
[4] mailto:django _AT_ lists.afpy.org
[5] http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#5 14-09-2014 11:08:21

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : Utilisation de ForeignKey.to_field

Bonjour,

Je pense que si F.D.V te propose de faire une classe pour le type de
paiement, c'est pour imposer un type de paiement parmi ceux disponible dans
la table y faisant référence. Il peut y avoir par exemple dans ta Table
typedepaiement 4 items avec chacun un nom. Tu devras alors choisir le bon
id de l'item correspondant au type de paiement. Impossible de mettre autre
chose qu'un type de paiement prédéfini.
Si tu utilises un champ de texte pour le type de paiement dans ta classe
Règlement, tu pourrais entrer n'importe quel type de chaîne de caractères
en guise de type de paiement.

Je pense que tu devrais lire quelques bases sur le fonctionnement d'un base
de données relationnelles.
D'ailleurs, il reste plus conventionnel de faire une relation sur l'id
d'une table et pas un autre champ. D'autant qu'un id est toujours unique et
indexé. Tu peux récupérer l'objet à partir de l'id et faire ce que tu veux
avec.

Sinon, pour __str__ en double dans la définition de ta classe, je pense
qu'il serait plus qu'intéressant pour toi de lire un livre sur le
développement en Python et pourquoi pas suivre quelques tutoriels pour
commencer... Cela te fera gagner beaucoup de temps par la suite et te
rendra mettre de ton code. Se lancer dans la construction d'une maison en
essayant de mettre le toit avant les fondations, ça n'a jamais très bien
marché smile

P.S: Évitions le français dans le code... Seul les Francophones comprennent
le français et tout code doit écrit pour être lu par quelqu'un d'autres.
L'anglais est la langue universel à favoriser ici. Autant en prendre
l'habitude dès le départ.

Bon courage

Le 1 septembre 2014 12:15, Charlie Gentil <ceg _AT_ redaction-developpez.com> a
écrit :

>  Salut et merci pour ta réponse.
>
> Concernant __str__ ou __unicode__, comme l'a dit Damien je travaille avec
> Python3 et c'est donc __str__ qui doit être utilisé.
>
> Concernant le nombre de __str__ je n'ai pas assez fait de test pour me
> rendre compte si ça fonctionnait bien ou pas ... et en fait il semblerait
> que mon souci vienne tout simplement de là.
>
>
>
> Par contre je ne comprends pas trop pourquoi tu veux que je refasse une
> classe TypePaiement... Il y aura effectivement plusieurs types de paiement,
> tout comme je vais avoir plusieurs nom, adresses, mail ... de clients. Je
> vais pas refaire une classe pour chaque car là ça risque de sacrément
> devenir compliqué... non ?
>
>
>
> Merci de ton aide en tout cas.
>
>
>
> ++
>
>
>
>
> Le lundi 1 septembre 2014, 10:58:50 F. D.V. a écrit :
>
> Salut,
>
> Je vois plusieurs choses bizarres dans ton code :
>
>
> Il y a 2 __str__ dans ta class Reglement.. le 2eme ne sera jamais exécuté,
> d'ailleurs je crois qu'il vaut mieux utiliser __unicode__ à la place....
>
>
> Tu ne devrais pas écrire le nom des attributs en majuscules (par
> convention)
>
> Étant donné qu'il y aura plusieurs type de paiement, tu devrais faire une
> class pour lui
>
> J'ai refait ton code, très rapidement, sans le tester... :
>
>
>
> class TypePaiement(models.Model):
>     nom = models.CharField(max_length=10, unique=True)
>
>     def __unicode__(self):
>         return self.nom
>
> class Reglement(models.Model):
>     typePaiement = models.ForeignKey(TypePaiement)
>     libelle = models.CharField(max_length=200)
>
>     def __unicode__(self):
>         return "%s (%s)" % (self.libelle, self.typePaiement.nom)
>
>  class Client(models.Model):
>     reglement = models.ForeignKey(Reglement)
>
>
>
>
> -------------------------------------------
>
> François DE VAL
> 07 81 17 44 80
>
> http://aliaz.com/francois-deval
>
>
>
> Le 1 septembre 2014 10:04, Charlie Gentil <ceg _AT_ redaction-developpez.com>
> a écrit :
>
> Bonjour,
>
>
>
> Dans mon appli je souhaite associer à un model la valeur d'un autre via un
> champ défini.
>
> Plus concrètement j'ai un model définissant un client et je souhaite y
> lier un mode de règlement via le code de ce dernier.
>
>
>
> Voici mon code :
>
>
>
> class Reglement(models.Model):
>
> TYPE = models.CharField('Mode de Règlement', max_length=10, unique=True)
>
> LIB = models.CharField('Libellé', max_length=200)
>
> def __str__(self):
>
> return self.TYPE
>
> def __str__(self):
>
> return self.LIB
>
>
>
> class Client(models.Model):
>
> REGLT = models.ForeignKey(Reglement, to_field="TYPE")
>
>
>
>
>
> En lisant la doc je crois comprendre que c'est bien to_field qu'il faut
> utiliser (
> https://docs.djangoproject.com/fr/1.6/ref/models/fields/#foreignkey),
> mais malheureusment lorsque je veux créer un nouveau client ceux sont les
> différents LIB qui sortent et pas les TYPES.
>
>
>
>
>
> Ai-je loupé quelque chose ?
>
>
>
> D'avance merci pour votre aide.
>
>
>
> Charlie
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>
>
>
>
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

Pied de page des forums