【问题标题】:how to get field type string from db model in django如何从 django 的 db 模型中获取字段类型字符串
【发布时间】:2013-12-03 14:50:20
【问题描述】:

我正在做以下事情:

model._meta.get_field('g').get_internal_type

返回以下内容:

<bound method URLField.get_internal_type of <django.db.models.fields.URLField: g>>

我只想知道这个字段是 "URLField" 。我如何从这个输出中提取它?

注意:我这样做是为了对字段进行验证。例如,如果一个 url ,我想检查它是否格式正确。

【问题讨论】:

  • 你确定你在打电话吗?听起来您正在打印a.model._meta.get_field('g').get_internal_type
  • 我正在打印它。我希望它打印 URLField
  • 来自 Django docs 这是您想要完成的任务吗?
  • @croownedzero 我正在尝试获取模型字段的类型,以便进行一些验证。例如,如果一个 url,我想验证它的格式是否正确。
  • a 实际上是什么?我刚刚在 Django shell 中使用我的模型进行了尝试,并且确实得到了类似 Out[7]: u'CharField' 的输出,并且我直接在模型类上调用了 ._meta.get_field('g').get_internal_type()

标签: python django django-models


【解决方案1】:

如果你这样做:

model._meta.get_field('g').get_internal_type()

你不可能得到那个结果。

相反,您正在这样做:

model._meta.get_field('g').get_internal_type

正如here 解释的那样,它不调用方法,它只是将方法引用为绑定的方法对象。返回值不是该绑定方法对象的一部分,它是在调用方法时由方法创建的。所以,你必须调用它。所以你需要括号。

【讨论】:

    【解决方案2】:

    你可以这样做:

    from django.db.models.fields import *
    ....
    if model._meta.get_field('g').__class__ is UrlField:
        ....
    ....
    

    或者如果你想使用 String 而不是只使用 UrlField

    ....
    if type(model._meta.get_field('g')) is eval('UrlField'):
        ....
    ....
    

    isinstance(model._meta.get_field('g'), UrlField)
    # This will return Boolean result
    

    你也可以使用相等的 '==' 而不是 'is'

    您可以查看官方文档了解更多信息

    【讨论】:

      【解决方案3】:

      答案是改为调用方法:

      my_type = field.get_internal_type()
      

      【讨论】:

      • 他声称他正在调用该方法。该问题显然与您的答案具有完全相同的括号。 (显然他真的没有这样做。但是只是发布他已经拥有的相同代码并说这就是答案并不能帮助 OP,或者任何将来偶然发现这个功能的人。)
      • @abarnert 这个答案来自 OP
      • @RichardAbercrombie:啊,你说得对。我不记得 2 年前的这个问题了,但我仍然认为这个答案并没有添加任何东西——它只是从我的答案中获取代码(他接受了)并删掉了解释......
      • @abarnert 同意,只是想我会指出它以帮助解决在帮助 OP 时回答这个问题的困惑;)。累了,没注意到这是 2 岁!
      • @RichardAbercrombie 伙计们,让我们继续前进。这是一个新的时代。
      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 2020-07-07
      • 2011-02-04
      • 2016-08-11
      • 2015-10-12
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多