2010-03-05 11 views
35

Estoy tratando de obtener información de clase en un campo dentro de un modelo, cuando solo sé el nombre del campo y el nombre del modelo (ambas cadenas simples). ¿Como es posible?¿Cómo introspeccionar los campos del modelo django?

puedo cargar el modelo de forma dinámica:

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

Ahora he campo - 'myfield' - ¿Cómo puedo obtener la clase de ese campo?

Si el campo es relacional, ¿cómo obtener el campo relacionado?

¡Muchas gracias!

+0

Buena pregunta. Esto me salvó el culo – GabiMe

Respuesta

70

Puede usar el atributo _meta del modelo para obtener el objeto de campo y desde el campo puede obtener una relación y mucho más, p. considere una tabla de empleados que tiene una clave externa a una tabla departamento

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/modelos/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

sí, gracias get_field_by_name y otras funciones están definidas en django/db/models/options.py (en v1.1.1) – Evgeny

4

La respuesta de Anurag Uniyal utilizar get_field_by_name es ahora (5 años más tarde) obsoleto como get_field_by_name está en desuso. Django le dará la siguiente pista:

RemovedInDjango110Warning: 'get_field_by_name es una API no oficial que ha quedado en desuso. Es posible que pueda sustituirlo por 'get_field()'

documentación de la API para get_field son here.

1

Si desea ver TODOS los campos en un objeto modelo de Django, puede simplemente introspeccionarlo llamando al ._meta.get_fields() en la clase (o un objeto de modelo instanciado) para obtener una lista de todos los campos. Esta API es actual con la última versión de Django.

Ejemplo:

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

Esto devolverá una tupla de todos los campos del modelo. La documentación se puede encontrar HERE.

Cuestiones relacionadas