2010-09-13 23 views
5

Après avoir essayé de faire fonctionner cela pendant un moment et de chercher autour je suis vraiment perplexe alors je poste ici ... Je veux faire des fonctions dans les classes que j'écris pour django aussi générique que possible, donc je veux utiliser getattr d'appeler des fonctions comme celle ci-dessous de manière générique:Python, Django, comment utiliser getattr (ou une autre méthode) pour appeler un objet qui a plusieurs attributs?

la façon dont je le fais qui fonctionne (de manière non générique):

from django.db.models import get_model 
mymodel = get_model('appname', 'modelname') 
dbobject = mymodel.objects.all() 

un de mes tentatives de créer cela d'une manière générique, encore ne fonctionne pas, il renvoie quelque chose en retour mais ce n'est pas le type d'objet approprié pour que je puisse récupérer les données (c'est un appel de base de données pour django)

ret = getattr(mymodel,'objects') 
dbobject = getattr(ret,'all') 

Répondre

12

Vous avez oublié d'appeler le résultat.

dbobject = mymodel.objects.all() 

Accède à la méthode mymodel.objects.all, puis l'appelle.

ret = getattr(mymodel,'objects') 
self.dbobject = getattr(ret,'all') 

accède à la méthode mymodel.objects.all mais ne l'appelle pas.

Tout ce que vous avez besoin est de changer la dernière ligne:

self.dbobject = getattr(ret,'all')() 
+0

merci .. ok je reçois maintenant .. Je l'avais essayé de faire quelque chose comme ça avant, mais mettais tout en un seul appel getattr, je comprends maintenant que je suis simplement appeler la partie « tout » avec le reste de la "partie précédente" en tant qu'objet dans le getattr, donc cela doit être fait séparément, merci de l'avoir éclairci ... Je pensais pouvoir faire: dbobject = getattr (model, 'objects.all')() mais cela ne fonctionnait pas donc ce genre de me confondre à partir de là – Rick

2

Vous devrez appel l'attribut si elle est une fonction, par exemple

ret = getattr(mymodel,'objects') 
all = getattr(ret,'all') 
self.dbobject = all()