Как динамически получить доступ к подробному имени поля модели Django? - PullRequest
31 голосов
/ 12 марта 2010

Я хотел бы иметь доступ к одному полю моей модели verbose_name.

Я могу получить это по индексу поля, как это

model._meta._fields()[2].verbose_name

но мне нужно получить его динамически. В идеале это было бы что-то вроде этого

model._meta._fields()['location_x'].verbose_name

Я посмотрел несколько вещей, но просто не могу их найти.

Ответы [ 6 ]

47 голосов
/ 12 марта 2010

Для Джанго <1.10: </p>

model._meta.get_field_by_name('location_x')[0].verbose_name
19 голосов
/ 28 января 2014

model._meta.get_field('location_x').verbose_name

12 голосов
/ 17 ноября 2017

Для Django 1.11 и 2.0:

MyModel._meta.get_field('my_field_name').verbose_name

Больше информации в Django doc

12 голосов
/ 04 сентября 2014

Выбранный ответ дает прокси-объект, который может выглядеть следующим образом.

<django.utils.functional.__proxy__ object at 0x{SomeMemoryLocation}>

Если кто-то видит то же самое, строку для подробного имени можно найти в функции-члене title () объекта-посредника.

model._meta.get_field_by_name(header)[0].verbose_name.title()

Лучший способ написать это было бы:

model._meta.get_field(header).verbose_name.title()

, где header будет именем интересующего вас поля. То есть location-x в контексте OP.

ПРИМЕЧАНИЕ : разработчики Django также считают, что использование get_field лучше, и поэтому в Django 1.10 обесценились get_field_by_name Поэтому я бы предложил использовать get_field независимо от того, какую версию Django вы используете.

7 голосов
/ 12 марта 2010
model._meta.get_field_by_name('location_x')[0].verbose_name
0 голосов
/ 12 ноября 2018

Если вы хотите перебрать все поля, вам нужно получить field:

for f in BotUser._meta.get_fields():
    if hasattr(f, 'verbose_name'):
        print(f.verbose_name)
...