Comment utiliser django model fields?

j'essaie d'obtenir des informations de classe sur un champ à l'intérieur d'un model, quand je ne connais que le nom du champ et le nom du model (les deux chaînes simples). Comment est-il possible?

je peux charger le modèle dynamiquement:

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

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

Si le champ est relationnel - comment obtenir un domaine connexe?

Merci beaucoup!

35
demandé sur Evgeny 2010-03-05 06:45:00

4 réponses

vous pouvez utiliser l'attribut _meta du model pour obtenir un objet de champ et à partir du champ vous pouvez obtenir une relation et beaucoup plus, par exemple considérer une table d'employé qui a une clé étrangère à une table de ministère

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].target_field
Out[4]: 'id'

In [5]: dep_field[0].related_model
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.
    """
70
répondu Anurag Uniyal 2018-09-24 14:35:07

la réponse d'Anurag Uniyal à l'utilisation de get_field_by_name est maintenant (5 ans plus tard) obsolète car get_field_by_name est déprécié. Django vous donnera l'indice suivant:

RemovedInDjango110Warning: 'get_field_by_name est un non-officiel de l'API qui a été désapprouvée. Vous pourriez être en mesure de la remplacer par 'get_field ()'

les docs de l'API pour get_field sont ici .

5
répondu tobltobs 2016-05-03 18:31:37

si vous souhaitez voir tous les champs sur un objet modèle Django, vous pouvez tout 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()

cela va retourner un tuple de tous les champs du modèle. La Documentation peut être trouvée ici .

1
répondu Colton Hicks 2018-01-11 18:51:54

django.DB.modèle.chargement.get_model() a été supprimé dans django 1.9. Tu es censé utiliser django.applications à la place.

'get_field_by_name est une API non officielle qui a été dépréciée dans Django 1.10. Vous pouvez le remplacer par' 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>) 

lien vers l'édition

0
répondu Gambitier 2018-07-18 13:46:09