【问题标题】:How can I get access to a Django Model field verbose name dynamically?如何动态访问 Django 模型字段详细名称?
【发布时间】:2011-01-26 14:38:05
【问题描述】:

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

我可以通过这样的字段索引得到它

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

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

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

我看了一些东西,但就是找不到。

【问题讨论】:

    标签: django get field


    【解决方案1】:

    对于 Django

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

    【讨论】:

    • 我收到'str' object has no attribute '_meta' 错误。 Django 1.7.
    • @MikhailBatcer:我不知道怎么解释给你,但是......字符串没有字段。
    • 嗯,它是模型对象,它在你的 sn-p 中传递,而不是字符串,不是吗?
    • 好吧,我有,我有模板过滤器:def verbose_name(value, arg): return value._meta.get_field_by_name(arg)[0].verbose_name,在模板中:{{ book|verbose_name:"title" }}
    • get_field_by_name 方法是 removed for Django 1.10,加上下面建议的使用 get_field 看起来不太像 hack...
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      对于 Django 1.11 和 2.0:

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

      更多信息在Django doc

      【讨论】:

        【解决方案4】:

        所选答案给出了一个可能如下所示的代理对象。

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

        注意:Django 的开发人员也觉得使用get_field 更好,因此在 Django 1.10 中已经贬低了get_field_by_name。因此,无论您使用什么版本的 Django,我都建议使用 get_field

        【讨论】:

          【解决方案5】:
          model._meta.get_field_by_name('location_x')[0].verbose_name
          

          【讨论】:

            【解决方案6】:

            如果您想迭代所有需要获取 field 的字段:

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

            【讨论】:

              【解决方案7】:

              你也可以使用:

              Model.location_x.field.verbose_name
              

              Model 是类名。我在我的 Animal 模型上对此进行了测试:

              Animal.sale_price.field.verbose_name
              

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

              注意:我使用的是 Django 3.1.5

              【讨论】:

                【解决方案8】:
                # 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)
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-17
                  • 2010-10-29
                  • 2023-03-28
                  • 2016-07-18
                  • 2019-07-25
                  • 2022-06-12
                  • 2013-01-07
                  相关资源
                  最近更新 更多