wake-up-neo.com

Wie kann ich dynamisch auf ein Django Model-Feld mit einem ausführlichen Namen zugreifen?

Ich möchte Zugriff auf ein Feld meines Modells haben, verbose_name.

Ich kann es durch den Feldindex so bekommen

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

aber ich muss es dynamisch bekommen. Im Idealfall wäre es so etwas

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

Ich habe ein paar Dinge angeschaut, aber ich kann es einfach nicht finden.

30
philgo20

Für Django <1,10:

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

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

16

Die ausgewählte Antwort ergibt ein Proxy-Objekt, das wie folgt aussehen könnte.

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

Wenn jemand dasselbe sieht, finden Sie die Zeichenfolge für den ausführlichen Namen in der titel() Mitgliedsfunktion des Proxy-Objekts.

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

Ein besserer Weg, dies zu schreiben, wäre:

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

wobei header der Name des Feldes ist, an dem Sie interessiert sind, d. h. 'location-x' im Kontext von OPs.

NOTE: Entwickler von Django sind der Meinung, dass die Verwendung von get_field besser ist und haben daher get_field_by_name in Django 1.10 abgewertet. Daher würde ich vorschlagen, get_field zu verwenden, egal welche Django-Version Sie verwenden.

12
nnb

Für Django 1.11 und 2.0:

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

Mehr Infos im Django doc

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

Wenn Sie alle Felder durchlaufen möchten, müssen Sie die field abrufen:

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