2010-02-22 2 views
1

J'ai ce modèle django:Dans le modèle d'économie() comment obtenir tous les champs commençant par « foo »

from django.db import models 

class MyModel(models.Model): 
    foo_it = model.CharField(max_length=100) 
    foo_en = model.CharField(max_length=100) 

    def save(self): 
     print_all_field_starting_with('foo_') 
     super(MyModel, self).save() 

Je veux obtenir tous les champs commençant par foo (comme exemple) et faire quelque chose avec ça. Je ne peux pas le faire dans le code parce que je ne connais pas tous les champs du modèle (j'utilise django-transmeta)

alors, comment puis-je faire cela?

Merci à l'avance;)

Répondre

2

Il existe une méthode get_all_field_names() qui est intégré dans la sous-classe Meta pour tous les modèles, et se trouve dans foo._meta.get_all_field_names():

>>> from foo.models import Foo 
>>> f = Foo.objects.get(pk=1) 
>>> f._meta.get_all_field_names() 
['active', 'created', 'expires', 'id', , 'inputter', 'reason', 'requester', 'updated'] 

Donc, ce serait une chose simple:

def print_all_fields_starting_with(obj, starter): 
    fields = [x for x in obj._meta.get_all_field_names() if x.startswith(starter)] 
    for field in fields: 
     print getattr(obj, field) 

Et dans votre personnalisation :

def save(self): 
    print_all_fields_starting_with(self, "foo_") 
    super(MyModel, self).save() 
+0

Cool! Belle solution: D Merci;) – patrick

2

Vous pouvez faire:

for field in dir(self): 
    if field.startswith('foo_'): 
     # getting with getattr(self, field) 
     # setting with setattr(self, field, value) 

Si vous souhaitez obtenir la liste des champs que vous pouvez donc ceci:

foo_fields = [field for field in dir(self) if field.startswith('foo_')] 

Ou imprimer une liste de valeurs de foo champs:

print map(lambda x: getattr(self, x), [field for field in dir(self) if field.startswith('foo_')]) 
+0

Than ks cela fonctionne: D – patrick

2

Cela fera l'affaire, mais vous devez aussi passer dans l'objet dont les champs que vous souhaitez imprimer:

import inspect 
def print_all_field_starting_with(prefix, object): 
    for name, value in inspect.getmembers(object): 
     if name.startswith(prefix): 
      print name # or do something else 

Voir la documentation for the inspect module pour plus d'informations.

+0

Merci;) Je vais l'utiliser :) – patrick

+1

Non, cela ne fonctionne pas :(Je reçois une erreur: Le gestionnaire n'est pas accessible via Post instance. Merci cependant. – patrick

+0

On dirait qu'il y a un ticket Django lié à cette erreur: https://code.djangoproject.com/ticket/12568 – saltycrane

Questions connexes