2010-03-05 7 views
35

J'essaie d'obtenir des informations de classe sur un champ à l'intérieur d'un modèle, lorsque je ne connais que le nom du champ et le nom du modèle (les deux chaînes en clair). Comment est-ce possible?Comment introspecter les champs de modèle django?

je peux charger le modèle dynamique:

from django.db import models 
model = models.get_model('myapp','mymodel') 

Maintenant, j'ai champ - « myfield » - comment puis-je obtenir la classe de ce champ?

Si le champ est relationnel - comment obtenir un champ associé?

Merci beaucoup!

+0

Bonne question. Cela a sauvé mon cul – GabiMe

Répondre

70

Vous pouvez utiliser l'attribut _meta du modèle pour obtenir un objet de champ et, à partir du champ, vous pouvez obtenir une relation et bien plus encore. envisager une table des employés qui a une clé étrangère à une table du département

In [1]: from django.db import models 

In [2]: model = models.get_model('timeapp', 'Employee') 

In [3]: dep_field = model._meta.get_field_by_name('department') 

In [4]: dep_field[0].rel.field_name 
Out[4]: 'id' 

In [5]: dep_field[0].rel.to 
Out[5]: <class 'timesite.timeapp.models.Department'> 

de django/db/modèles/options.py

def get_field_by_name(self, name): 
    """ 
    Returns the (field_object, model, direct, m2m), where field_object is 
    the Field instance for the given name, model is the model containing 
    this field (None for local fields), direct is True if the field exists 
    on this model, and m2m is True for many-to-many relations. When 
    'direct' is False, 'field_object' is the corresponding RelatedObject 
    for this field (since the field doesn't have an instance associated 
    with it). 

    Uses a cache internally, so after the first access, this is very fast. 
    """ 
+1

oui, merci get_field_by_name et d'autres fonctions sont définies dans django/db/models/options.py (en v1.1.1) – Evgeny

4

La réponse de Anurag Uniyal à utiliser get_field_by_name est maintenant (5 années plus tard) obsolète car get_field_by_name est obsolète. Django vous donnera l'indication suivante:

RemovedInDjango110Warning: « get_field_by_name est une API non officielle qui a été désapprouvée. Vous pourrez peut-être de le remplacer par 'get_field()'

API docs pour get_field sont here.

1

Si vous souhaitez voir TOUS les champs d'un objet modèle Django, vous pouvez simplement l'introspecter en appelant ._meta.get_fields() sur la classe (ou un objet modèle instancié) pour obtenir la liste de tous les champs. Cette API est à jour avec la dernière version de Django.

Exemple:

from django.contrib.auth.models import User 
User._meta.get_fields() 

Ceci renvoie un tuple de tous les champs du modèle. La documentation peut être trouvée HERE.

Questions connexes