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

phi*_*o20 31 django field get

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

我可以通过像这样的现场指示得到它

model._meta._fields()[2].verbose_name
Run Code Online (Sandbox Code Playgroud)

但我需要动态地得到它.理想情况下,它会是这样的

model._meta._fields()['location_x'].verbose_name
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 48

对于Django <1.10:

model._meta.get_field_by_name('location_x')[0].verbose_name
Run Code Online (Sandbox Code Playgroud)

  • @MikhailBatcer:我不知道怎么打破这个,但是...字符串没有字段. (5认同)
  • 嗯,而且我这样做,我有模板过滤器:`def verbose_name(value,arg):return value._meta.get_field_by_name(arg)[0] .verbose_name`和in template:`{{book | verbose_name:"title "}}` (2认同)
  • `get_field_by_name`方法[为Django 1.10删除](https://docs.djangoproject.com/en/1.11/internals/deprecation/#deprecation-removed-in-1-10),另外使用下面建议的'get_field`看起来不那么黑客...... (2认同)

Ber*_*age 19

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


tup*_*pan 13

对于Django 1.11和2.0:

MyModel._meta.get_field('my_field_name').verbose_name
Run Code Online (Sandbox Code Playgroud)

Django doc中的更多信息


nnb*_*nnb 12

所选答案提供了一个代理对象,可能如下所示.

<django.utils.functional.__proxy__ object at 0x{SomeMemoryLocation}>
Run Code Online (Sandbox Code Playgroud)

如果有人看到相同的内容,您可以在代理对象的title()成员函数中找到详细名称的字符串.

model._meta.get_field_by_name(header)[0].verbose_name.title()
Run Code Online (Sandbox Code Playgroud)

写这个的更好方法是:

model._meta.get_field(header).verbose_name.title()
Run Code Online (Sandbox Code Playgroud)

header您感兴趣的字段的名称将在哪里.即OPs上下文中的"location-x".

注意:Django的开发人员也觉得使用get_field更好,因此get_field_by_name在Django 1.10中有所折旧.因此,get_field无论您使用什么版本的Django,我都建议使用.


Dmi*_*nko 7

model._meta.get_field_by_name('location_x')[0].verbose_name
Run Code Online (Sandbox Code Playgroud)


Loa*_*ron 5

您还可以使用:

Model.location_x.field.verbose_name
Run Code Online (Sandbox Code Playgroud)

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

Animal.sale_price.field.verbose_name
Run Code Online (Sandbox Code Playgroud)

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

注意:我使用的是 Django 3.1.5