Как исследовать поля модели Django? - PullRequest
35 голосов
/ 05 марта 2010

Я пытаюсь получить информацию о классе для поля внутри модели, когда я знаю только имя поля и название модели (обе простые строки). Как это возможно?

Я могу загрузить модель динамически:

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

Теперь у меня есть поле - "мое поле" - как я могу получить класс этого поля?

Если поле реляционное - как получить связанное поле?

Спасибо большое!

Ответы [ 4 ]

73 голосов
/ 05 марта 2010

Вы можете использовать атрибут модели _meta для получения объекта поля, а из поля вы можете получить отношения и многое другое, например, рассмотреть таблицу сотрудников, которая имеет внешний ключ к таблице отделов

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

от 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.
    """
7 голосов
/ 03 мая 2016

Ответ от Anurag Uniyal на использование get_field_by_name сейчас (через 5 лет) устарел, поскольку get_field_by_name устарел.Django даст вам следующую подсказку:

RemovedInDjango110Warning: 'get_field_by_name - неофициальный API, который устарел.Вы можете заменить его на get_field ()

Документы API для get_field здесь .

2 голосов
/ 11 января 2018

Если вы хотите видеть ВСЕ поля в объекте модели Django, вы можете просто проанализировать его, вызвав ._meta.get_fields() в классе (или объекте экземпляра модели), чтобы получить список всех полей. Этот API актуален в последней версии Django.

Пример:

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

Это вернет кортеж всех полей модели. Документацию можно найти ЗДЕСЬ .

1 голос
/ 16 июля 2018

django.db.models.loading.get_model () была удалена в django 1.9. Вместо этого вы должны использовать django.apps.

'get_field_by_name - это неофициальный API, который устарел в Django 1.10. Вы можете заменить его на '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>) 

ссылка на выпуск

...