Под "field (enum)" вы подразумеваете, что вы используете опцию choices для поля?
Простой набор вариантов работает достаточно хорошо для небольших списков конверсий. Это позволяет вам делать упрощающие предположения, которые помогают вашим пользователям (и вам) получить то, что работает.
Создание формальной модели для блоков следует выполнять только в том случае, если у вас есть (а) ОЧЕНЬ МНОГО единиц, (б) ваша необходимость ее расширения, И (в) есть некоторые рациональные ожидания, что поиск в БД будет значение.
Юниты меняются не так часто. Кажется, есть небольшая причина использовать базу данных для этого. Кажется, намного проще жестко закодировать список вариантов.
Выбор
Например, вы можете использовать что-то подобное для отслеживания конверсий.
UNIT_CHOICES = ( ('m', 'meters'), ('f', 'feet' ), ('i', 'inches'), ('pt', 'points') )
unit_conversions = {
('m','f'): 3.xyz,
('m','i'): 39.xyz,
('m','pt'): 29.xyz*72,
('f','m'): 1/3.xyz,
('f','i'): 12.0,
('f','pt'): 12.0*72,
etc.
}
Учитывая это отображение, вы можете получить коэффициент преобразования в вашем методе преобразования.
функция, сделать математику и вернуть преобразованные единицы.
class WithUnit( Model ):
...
def toUnit( self, someUnit ):
if someUnit == self.unit: return self.value
elif (someUnit,self.unit) in unit_conversions:
return self.value * unit_conversions[(someUnit,self.unit)]
else:
raise Exception( "Can't convert" )
Модель .
Если вы хотите создать формальную модель для единиц, вам необходимо иметь при себе тип измерения (длина, объем, масса, вес / сила, давление, температура и т. Д.) И различные коэффициенты пересчета единиц. Это работает для всего, кроме температуры, где у вас есть постоянный член в дополнение к фактору.
Вы должны выбрать базовый набор единиц (например, MKS ) и нести все множители между различными единицами.
Вы также должны выбрать, сколько английских единиц нужно загрузить в ваш стол (жидкие унции, чайные ложки, столовые ложки, чашки, пинты, кварты и т. Д.)