如何在django中获取模型的原生类型

时间:2013-04-09 22:29:28

标签: python django django-models

我需要动态检查应用中模型中所有字段的python类型,也就是说,我有:

class MyModel(model.Model):
    field1 = model.CharField(max_length=20)
    field2 = modelf.IntegerField()
    ...
    fieldn = models.BooleanField()

我需要完成类似的事情:

>>> for field in MyModel._meta.fields:
•••     field.type
•••
<type 'str'>
<type 'int'>
...

显然field.type是不存在的东西,但是我需要检索模型在创建/更新模型时应该接受的内置类型。 ForeignKeys和M2M是一个特殊情况,可以忽略这个问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

抱歉,Field不包含此类信息。 to_python方法用于将值转换为预期的Python数据类型,并且可以随意返回它喜欢的值。

您可以自己构建类型地图,显然仅限于您了解的字段类型:

FIELD_PYTHON_TYPES = {
    'AutoField': int,
    'BooleanField': bool,
    'CharField': unicode,
    'DateField': datetime.date,
    'DateTimeField': datetime.datetime,
    'DecimalField': decimal.Decimal,
    'FloatField': float,
    'IntegerField': int,
    'BigIntegerField': int,
     ... # etc.
}

并使用get_internal_type查找其中的类型:

for field in MyModel._meta.fields:
    FIELD_PYTHON_TYPES[field.get_internal_type()]

但即便如此,内置NullBooleanField也可以使用两种类型(boolNoneType),因此它远非一般解决方案。