Подтвердить что ты не робот

Как исследовать поля модели django?

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

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

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

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

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

Спасибо, куча!

4b9b3361

Ответ 1

Вы можете использовать атрибут _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].rel.field_name
Out[4]: 'id'

In [5]: dep_field[0].rel.to
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.
    """

Ответ 2

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

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

API docs для get_field здесь.