web-dev-qa-db-fra.com

Comment puis-je accéder dynamiquement à un modèle de modèle Django?

J'aimerais avoir accès à l'un de mes champs de modèle nom_base.

Je peux l'obtenir par l'indice de champ comme celui-ci

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

mais j'ai besoin de l'obtenir de manière dynamique. Idéalement, ce serait quelque chose comme ça

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

J'ai examiné certaines choses mais je ne les trouve pas.

30
philgo20

Pour Django <1.10:

model._meta.get_field_by_name('location_x')[0].verbose_name
46

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

16
Bertrand Bordage

La réponse sélectionnée donne un objet proxy qui pourrait ressembler à celui ci-dessous.

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

Si quelqu'un voit la même chose, vous pouvez trouver la chaîne du nom détaillé dans le champ titre() fonction membre de l'objet proxy.

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

Une meilleure façon d'écrire cela serait:

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

header sera le nom du champ qui vous intéresse. Par exemple, "emplacement-x" dans le contexte des PO.

NOTE: Les développeurs de Django estiment également que l’utilisation de get_field est préférable et ont donc amorti get_field_by_name dans Django 1.10. Ainsi, je suggérerais d'utiliser get_field quelle que soit la version de Django que vous utilisez.

12
nnb

Pour Django 1.11 et 2.0:

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

Plus d'infos dans le Django doc

10
tupan
model._meta.get_field_by_name('location_x')[0].verbose_name
7
Dmitry Shevchenko

Si vous voulez parcourir tous les champs, vous devez obtenir la variable field:

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