unique_together tutorial framework example decimalfield choices python django-models introspection

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>)

enlace al problema