2010-12-13 17 views
1

Existe-t-il un moyen facile d'obtenir tous les champs d'un certain modèle django, même ceux définis via une clé étrangère ou plusieurs à plusieurs champs sur une autre relation?Django - comment obtenir tous les champs du modèle

Exemple:

class A(models.Model): 
    some_number = models.IntegerField() 

class B(models.Model): 
    link_to_a = models.ForeignKey(A, related_name="link_to_b") 

Invoquer la méthode pour A retournerait id, some_number, link_to_b.

Répondre

2

Vous pouvez utiliser le semi-documenté, API non publiques sur la propriété _meta d'une classe de modèle:

from myapp.models import A 

for f in A._meta._fields(): 
    print f.name 

(note, il y a un élément de travail existant dans Django pour documenter cette API: http://code.djangoproject.com/ticket/12663 Cependant, vous devrez suivre manuellement les relations, et entrer leurs noms de champs.

champs de relations auront une rel propriété:

from myapp.models import A 

for f in A._meta._fields(): 
    print f.name 

    if hasattr(f, 'rel'): 
     print "Grab more fields from " + rel.to.name 
     g in rel.to._meta._fields(): 
      print g.name 
+0

Ceci renvoie seulement les champs du modèle. –

+0

Mis à jour, vous pouvez rechercher les propriétés "rel" dans les champs pour trouver les modèles associés, puis parcourir leurs champs aussi. –

+0

Merci pour l'aide. C'est utile, mais ne résout toujours pas le problème. Les champs du modèle B ne sont pas trouvés car ils ne sont pas listés dans l'arbre des champs de A (puisqu'il est déclaré sur B et non sur A). –

0

Regardez dans les A._meta.fields très en situation irrégulière:

ForeignKeys = [f pour f si f dans A._meta.fields .attname.endswith ('_ id')]

les champs ont de nombreuses méthodes intéressantes que vous aurez à découvrir à l'aide dir() ou en lisant la source ...