2010-08-02 21 views
3

J'essaie de parcourir les propriétés dynamiques d'un Expando-Model afin de les afficher toutes. Est-il possible de faire cette autre que de créer votre propre méthode comme telle:Itération via les propriétés dynamiques d'Expando dans les modèles Django

class Event(db.Expando): 
    platform = db.ReferenceProperty(Platform) 
    date = db.DateTimeProperty() 

    def getValues(self): 
     return self._dynamic_properties 

Et puis dans le modèle - qui est passé d'un objet « plate-forme »:

{% for event in platform.event_set %} 
    <b>{{ event.date }}</b><br /> 
    {% for pair in event.getValues.items %} 
     {{ pair.0 }} = {{ pair.1 }}<br /> 
    {% endfor %} 
{% endfor %} 

Cela fonctionne, mais je suis je ne peux pas suprised faire simplement:

{% for event in platform.event_set %} 
    <b>{{ event.date }}</b><br /> 
    {% for pair in event.items %} 
     {{ pair.0 }} = {{ pair.1 }}<br /> 
    {% endfor %} 
{% endfor %} 

Sans avoir mon propre appel de méthode ... dois-je utiliser autre chose que '.items'?

+0

Est-ce que {% pour pair dans event._dynamic_properties.items%} ne fonctionne pas? –

+0

Non; il y avait quelqu'un qui a suggéré cela, mais la réponse a été retirée. Il n'est pas possible d'accéder aux propriétés qui commencent par un trait de soulignement. Bravo pour la suggestion. – Wex

Répondre

0

Vous pouvez utiliser une méthode « dynamic_properties » de db.Model pour récupérer les propriétés d'un Expando, dans le même format que la méthode «propriétés (comme indiqué under the Model class)

Rappelez-vous que ces fonctions ne renvoient pas une propriété de value, bien que ... 'properties' renvoie un dictionnaire de noms de propriétés mappés à leur classe d'implémentation (db.ReferenceProperty et db.DateTimeProperty, dans ce cas), et 'dynamic_properties' renvoie simplement une liste de noms de propriétés, puisque Expandos peut ' t mapper une valeur dynamique à une classe d'implémentation.

Afin d'obtenir la valeur de la propriété, vous devez utiliser getattr(model, prop_name). Il n'y a pas moyen d'utiliser cette fonction uniquement dans un modèle Django (sans custom tag library), mais vous pouvez garder et réécrivez votre méthode comme si ...

def getExpandoValues(self): 
    return dict((name, getattr(self, name)) for name, impl_class in self.dynamic_properties()) 

... et ré-écrire votre modèle pour accéder aux valeurs via la nouvelle entrée de dictionnaire:

{% for event in platform.event_set %} 
    <b>{{ event.date }}</b><br /> 
    {% for pair in event.getExpandoValues %} 
    {{ pair.0 }} = {{ pair.1 }}<br /> 
    {% endfor %} 
{% endfor %}