46

I'd like to have access to one my model field verbose_name.

I can get it by the field indice like this

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

but I need to get it dynamically. Ideally it would be something like this

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

I've looked at a few things but I just can't find it.

Qantas 94 Heavy
  • 15,750
  • 31
  • 68
  • 83
philgo20
  • 6,337
  • 6
  • 34
  • 43

8 Answers8

49

For Django < 1.10:

model._meta.get_field_by_name('location_x')[0].verbose_name
gdvalderrama
  • 713
  • 1
  • 17
  • 26
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
30

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

Bertrand Bordage
  • 921
  • 9
  • 16
20

For Django 1.11 and 2.0:

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

More info in the Django doc

renno
  • 2,659
  • 2
  • 27
  • 58
14

The selected answer gives a proxy object which might look as below.

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

If anyone is seeing the same, you can find the string for the verbose name in the title() member function of the proxy object.

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

A better way to write this would be:

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

where header will be the name of the field you are interested in. i.e., 'location-x' in OPs context.

NOTE: Developers of Django also feel that using get_field is better and thus have depreciated get_field_by_name in Django 1.10. Thus I would suggest using get_field no matter what version of Django you use.

Nithish
  • 1,580
  • 12
  • 21
7
model._meta.get_field_by_name('location_x')[0].verbose_name
Ozgur Vatansever
  • 49,246
  • 17
  • 84
  • 119
Dmitry Shevchenko
  • 31,814
  • 10
  • 56
  • 62
5

You can also use:

Model.location_x.field.verbose_name

Model being the class name. I tested this on my Animal model:

Animal.sale_price.field.verbose_name

Animal.sale_price returns a DeferredAttribute, which has several meta data, like the verbose_name

Note: I'm using Django 3.1.5

Alvaro Rodriguez Scelza
  • 3,643
  • 2
  • 32
  • 47
2

If you want to iterate on all the fields you need to get the field:

for f in BotUser._meta.get_fields():
    if hasattr(f, 'verbose_name'):
        print(f.verbose_name)
arianvc
  • 101
  • 10
  • 1
    Kudos. This is better than most solutions here! No beating around the bush (no need to specify any `field`). And is dynamic. – carla Nov 28 '22 at 13:49
0
# select fields for bulk_update : exclude primary key and relational
fieldsfields_to_update = []
for field_to_update in Model._meta.get_fields():
        if not field_to_update.many_to_many and not field_to_update.many_to_one and not field_to_update.one_to_many and not field_to_update.one_to_one and not field_to_update.primary_key and not field_to_update.is_relation :
            fields_to_update = fields_to_update + [field_to_update.name]
Model.objects.bulk_update(models_to_update , fields_to_update)
freelance
  • 1
  • 1