2010-03-05 7 views
35

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

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

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

Теперь я поле - «MyField» - как я могу получить класс этой области?

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

Спасибо!

+0

Хороший вопрос. Это спасло мою задницу – GabiMe

ответ

70

Вы можете использовать атрибут модели _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'> 

от Джанго/DB/модели/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. 
    """ 
+1

да, спасибо get_field_by_name и другие функции определены в django/db/models/options.py (в версии 1.1) – Evgeny

4

Ответ от Анурагом Uniyal использовать get_field_by_name теперь (5 лет позже) устаревший как get_field_by_name устарел. Джанго даст вам следующий намек:

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

API Docs для get_field являются here.

1

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

Пример:

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

Это возвращает кортеж из всех модельных полей. Документацию можно найти HERE.

Смежные вопросы