python - framework - django tutorial
¿Cómo introspeccionar los campos del modelo django? (4)
Estoy tratando de obtener información de clase en un campo dentro de un modelo, cuando solo conozco el nombre del campo y el nombre del modelo (ambas cadenas simples). ¿Como es posible?
Puedo cargar el modelo dinámicamente:
from django.db import models
model = models.get_model(''myapp'',''mymodel'')
Ahora tengo campo - ''myfield'' - ¿cómo puedo obtener la clase de ese campo?
Si el campo es relacional, ¿cómo obtener el campo relacionado?
¡Gracias un montón!
La respuesta de Anurag Uniyal para usar get_field_by_name
es ahora (5 años después) obsoleta ya que get_field_by_name
está en desuso. Django te dará la siguiente pista:
RemovedInDjango110Advertencia: ''get_field_by_name es una API no oficial que ha sido desaprobada. Puede reemplazarlo con ''get_field ()''
Los documentos API para get_field
están here .
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, por ejemplo, considerar una tabla de empleado que tenga una clave externa para una tabla de 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 / models / 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.
"""
Si desea ver TODOS los campos en un objeto modelo de Django, puede simplemente introspectarlo llamando a ._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 .
django.db.models.loading.get_model () ha sido eliminado en django 1.9. Se supone que debes usar django.apps en su lugar.
''get_field_by_name es una API no oficial que ha quedado obsoleta en Django 1.10. Puede reemplazarlo con ''get_field ()''
>>> from django.apps import apps
>>> from polls.models import Question
>>> QuestionModel = apps.get_model(''polls'',''Question'')
>>> QuestionModel._meta.get_field(''pub_date'')
>>> QuestionModel._meta.get_fields()
(<ManyToOneRel: polls.choice>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.CharField: question_text>, <django.db.models.fields.DateTimeField: pub_date>)