36 votes

Comment faire l'introspection des champs de modèle Django?

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 simples). Comment est-ce possible?

Je peux charger le modèle dynamiquement:

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

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

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

Merci beaucoup!

73voto

Anurag Uniyal Points 31931

Vous pouvez utiliser l'attribut _meta du modèle pour obtenir un objet de champ. Vous pouvez également obtenir une relation entre autres. Vous pouvez par exemple prendre en compte une table d'employé possédant une clé étrangère dans une table de 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'>
 

à partir 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.
    """
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X