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

Django Python Discussion :

Acces par son nom à la Valeur d'un champ d'une instance de model


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Par défaut Acces par son nom à la Valeur d'un champ d'une instance de model
    Accès par son nom à la Valeur d'un champ d'une instance de model
    ---
    Bonjour,

    Soit les deux classes Pays et Region:
    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
    class Pays(models.Model):
      nom = models.CharField()
      code = models.CharField()
        class Meta:
            db_table = 'pays'
        def __unicode__(self):  # Python 3: def __str__(self):
            return self.nom
     
    class Region(models.Model):
      nom = models.CharField()
      code = models.CharField()
      pays = models.ForeignKey(Pays) 
        class Meta:
            db_table = 'region'
        def __unicode__(self):  # Python 3: def __str__(self):
            return self.nom
    Existe-t-il un moyen d'accéder au champ region.pays.code en utilisant une syntaxe du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    code = r.get('pays').get('code')
    ou
    code = r.get('pays.code')
    autrement dit sans nommer les propriétés pays et code ?

    Voici ce qu'on peut déjà faire mais ça ne suffit pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    p = Pays.objects.get(code='FR')
    p.nom => 'FRANCE'
    p.__dict__['nom'] => 'FRANCE'
     
    r = Region.objects.get(code='IDF')
    r.nom => 'ILE DE FRANCE'
    r.pays => <Pays: FRANCE>
    r.pays.code => 'FR'
    r.__dict__['nom'] => 'ILE DE FRANCE'

    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Hello,
    Si j'ai bien compris tu cherches le builtin getattr http://docs.python.org/2/library/functions.html#getattr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pays = getattr(r, 'pays')
    code = getattr(pays, "code")
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code = getattr(getattr(r, 'pays'), 'code')

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Par défaut
    Salut,
    Oui, c'est bien ça.
    En fait j'en ai besoin pour renvoyer les valeurs des colonnes au composant Datatables en utilisant django_datatables_view qui ne semble pas prévu pour les "models" en relation avec le "model" principal

    Il va falloir utiliser un nommage du type 'pays.code':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getattr(getattr(c, 'pays'), 'code')
    Merci.


    Citation Envoyé par valAa Voir le message
    Hello,
    Si j'ai bien compris tu cherches le builtin getattr http://docs.python.org/2/library/functions.html#getattr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pays = getattr(r, 'pays')
    code = getattr(pays, "code")
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code = getattr(getattr(r, 'pays'), 'code')

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Citation Envoyé par mbanaouas Voir le message
    Salut,
    Il va falloir utiliser un nommage du type 'pays.code':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getattr(getattr(c, 'pays'), 'code')
    Merci.
    Tu peux toujours te faire une petite fonction, par exemple :
    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
     
    >>> def get_nested_attr(obj, path):
    ...     for attr in path.split('.'):
    ...         obj = getattr(obj, attr)
    ...     return obj
    ... 
    >>> class Pays:
    ...     def __init__(self, code):
    ...         self.code = code
    ... 
    >>> class Region:
    ...     def __init__(self, pays):
    ...         self.pays = pays
    ... 
    >>> france = Pays(code='FRA')
    >>> aquitaine = Region(pays=france)
    >>> 
    >>> get_nested_attr(aquitaine, 'pays.code')
    'FRA'
    >>>
    Après je ne connais pas django_datatables_view, mais ce genre de besoin est un général un peu louche. Il n'y aurait pas un souci de conception, un moyen plus simple de faire les choses ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Par défaut
    Salut,

    Il s'agit de rendre paramétrable la liste des champs à afficher dans la grille, étant donné un "model" pivot et des "models" en relation. La modification de la liste des champs ne doit pas nécessiter la modification du code de la "view".

    Peux-tu préciser ce qui peut être un peu louche dans ce type de besoin ?

    Est-ce que ça concerne l'utilisation d'un composant supplémentaire comme django_datatables_view pour manipuler le composant datatables ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Bouton qui renvoi son nom comme valeur dans un champ idépendant
    Par therabbitkiller dans le forum VBA Access
    Réponses: 4
    Dernier message: 05/11/2012, 12h07
  2. [XML] Récupérer la valeur d'un champ par son nom
    Par Portekoi dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 06/07/2012, 13h43
  3. tester présence objet avant accès par son nom
    Par jfchappuis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2011, 07h53
  4. Accés à un JTextField par son nom
    Par 8itit dans le forum Composants
    Réponses: 1
    Dernier message: 17/07/2009, 09h39
  5. Réponses: 4
    Dernier message: 06/06/2004, 12h07

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