2013-11-16 2 views
0

я модель определяется как:Как найти иностранных ключевых мета-данных в Django

class DatasetPvtdata3(models.Model): 
    commodity = models.ForeignKey('DatasetSctg', related_name='+', to_field='description', db_column='commodity') 

Теперь во время выполнения, если я получаю строки DatasetPvtdata3 (название модели) и commodity (имя поля), как я могу найти соответствующее им имя модели внешнего ключа и соответствующий столбец (DatasetSctg и description)?

Вариант использования заключается в том, что сначала мне нужно выполнить запрос на модели DatasetPvtdata3, а затем использовать этот выход для фильтрации DatasetSctg.

+0

Вы хотите выполнить это в представлении django? Откуда берутся строки? Являются ли они POST или GET данными из шаблона? –

+0

Строки хранятся в отдельной таблице адаптеров, которая выступает в качестве адаптера между старыми полями модели к этому новому. Все это происходит в базовом логическом классе, создаваемом и вызываемом представлением. – prat0318

+0

Вы можете использовать django orm, чтобы запросить список атрибутов models.meta, а затем получить описание имени ect – agconti

ответ

0

Учитывая название модели как строки, я думаю, что самым безопасным способом получить соответствующий класс является использование рамки contenttypes. Что-то, как это должно работать, используя свое настоящее имя приложения:

from django.contrib.contenttypes.models import ContentType 
ct = ContentType.objects.get(app_name='my_app_name', model='DatasetPvtdata3') 
my_model = ct.model_class() 

Если вы не используете рамки типов контента, в теории вы можете получить модель из globals() если вы импортировали модель в какой-то модуль содержит поиск кода, но я бы не идти по этому пути, если я не должен был:

from my_app_name.models import DatasetPvtdata3 
my_model = globals().get('DatasetPvtdata3') 

чтобы получить объект поля, используйте my_model._meta.get_field_by_name('commodity'). Это возвращает кортеж, из которого поле является первым элементом.

Как только у вас есть поле, field.rel будет классом, представляющим отношения. field.rel.to будет моделью, с которой FK является (DatasetSctg - сам класс, а не строка, содержащая его название) и field.rel.field_name будет to_field (строка description).

+0

Это именно то, что мне нужно. благодаря – prat0318

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