2013-04-09 5 views
0

мне нужно динамически проверять типы питона всех полей в пределах моих моделей в приложении, то есть, учитывая, что у меня есть:Как получить собственный тип модели, в Джанго

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

К сожалению, Field s не содержит такой информации. Метод 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 может использовать два типа (bool и NoneType), так что это далеко не общее решение.

Смежные вопросы