在Django中获取模型的属性类型

abh*_*igi 5 python django

伙计们,我正在尝试获取模型属性的类型。例如,考虑以下模型:

class Option(models.Model):
  option_text  = models.CharField(max_length=400)
  option_num   = models.IntegerField()
  # add field to hold image or a image url in future

  def __unicode__(self):
        return self.option_text
Run Code Online (Sandbox Code Playgroud)

我正在以编程方式设置此模型的每个属性。我需要访问属性的类型。例如,对于option_num,我应该能够获得“ IntegerField”或等效值。

我看到了元api,也阅读了源代码。但是我看不到检索内部类型的方法。

model._meta.get_field(attr_value).getInternalType() => gives me an error.
Run Code Online (Sandbox Code Playgroud)

获取“ CharField”对象没有属性“获取内部类型”。

为了澄清一点,我需要知道一个属性是字符串还是整数的原因是,如果从前端得到一个字符串,它实际上是一个整数,我想进行类型转换。

救命?

谢谢!

Yon*_*lis 5

您已经接近元选项,但您需要记住一些 Python PEP8 Love。

如果你有这样的模型:

class Client(models.Model):
  code = models.IntegerField()
  name = models.CharField(max_length=96)
...
...
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式获取类型名称:

Client._meta.get_field('code').get_internal_type()
u'IntegerField'
Run Code Online (Sandbox Code Playgroud)

或者你可以通过以下方式获取类型:

type(Client._meta.get_field('name'))
django.db.models.fields.CharField
Run Code Online (Sandbox Code Playgroud)

直接像类方法一样,而不仅仅是来自类实例。你的选择。


Ser*_*jik 3

重点是使用

model._meta.get_field(attr_name).get_internal_type()
Run Code Online (Sandbox Code Playgroud)

代替

model._meta.get_field(attr_value).getInternalType()
Run Code Online (Sandbox Code Playgroud)