如何动态访问Django Model字段详细名称?

时间:2010-03-11 22:11:57

标签: django get field

我想访问一个我的模型字段verbose_name。

我可以通过像这样的字段来获得它

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

但我需要动态地获取它。理想情况下会是这样的

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

我看了几件事,但我找不到它。

7 个答案:

答案 0 :(得分:47)

对于Django< 1.10:

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

答案 1 :(得分:19)

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

答案 2 :(得分:12)

所选答案提供的代理对象可能如下所示。

<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将是您感兴趣的字段的名称,即OPs上下文中的“location-x”。

注意:Django的开发人员也认为使用get_field更好,因此在Django 1.10中折旧了get_field_by_name。因此,无论你使用什么版本的Django,我都建议使用get_field

答案 3 :(得分:11)

对于Django 1.11和2.0:

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

Django doc

中的更多信息

答案 4 :(得分:7)

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

答案 5 :(得分:0)

如果要遍历所有字段,则需要获取field

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

答案 6 :(得分:0)

您也可以使用:

Model.location_x.field.verbose_name

模型是类名。我在我的动物模型上测试了这个:

Animal.sale_price.field.verbose_name

Animal.sale_price 返回一个 DeferredAttribute,它有几个元数据,比如verbose_name

注意:我使用的是 Django 3.1.5