2009-07-28 8 views
1

Je voudrais construire une fonction dans Django qui itère sur un ensemble d'objets dans un ensemble de requêtes et fait quelque chose en fonction de la valeur d'un attribut arbitraire. Le type des objets est fixe; disons qu'ils sont garantis à partir du modèle de commentaire qui ressemble à ceci:Passage d'un nom d'attribut de modèle Django à une fonction

class Comment(models.Model): 
    name = models.CharField(max_length=255) 
    text = models.TextField() 
    email = models.EmailField() 

Parfois, je veux faire exécuter la fonction au cours des name s, mais d'autres fois les email s. Je voudrais savoir comment écrire et appeler une fonction qui ressemble à ceci:

def do_something(attribute, objects): 
    for object in objects: 
     # do something with the object based on object.attribute 
    return results 

Répondre

4
def do_something(attribute, objects): 
    results = [] 
    for object in objects: 
     if hasattr(object, attribute): 
      results.append(getattr(object, attribute)) 
    return results 

Ou, plus succinctement,

def do_something(attribute, objects): 
    return [getattr(o, attribute) for o in objects if hasattr(o, attribute)] 
+0

+1: règles getattr. –

1

vous ne faites pas clairement ce que vous voulez revenir de votre fonction, donc substituer une déclaration return appropriée. Je suppose attribute sera mis à l'un de "nom", "texte" ou "email".

def do_something(attribute, objects): 
    for o in objects: 
     print getattr(o, attribute) 
    return something 

Mise à jour: OK, vous avez mis à jour la question. La réponse de Cide est la plus logique maintenant.

4

Si vous ne faire des choses avec un seul attribut, vous pouvez utiliser .values_list(), qui est plus performant puisque vous n'êtes pas instancier tout objets, et vous ne faites que tirer la valeur spécifique que vous utilisez de la base de données.

>>> def do_something(values): 
...  for value in values: 
...   print value 
...  return something 
... 
>>> emails = Comment.objects.values_list('email', flat=True) 
>>> names = Comment.objects.values_list('name', flat=True) 
>>> do_something(emails) # Prints all email addresses 
>>> do_something(names) # Prints all names 
+0

+1 pour une solution Djangoic –

+0

+1 pour Magic Ponies! :) – Frozenskys

+0

+1 pour une réponse utile et un nouvel outil, mais j'ai besoin de faire des choses avec son objet entier. –

Questions connexes