Мне нужно сохранить некоторые значения в базе данных, расстояние, вес и т. д.
В моей модели у меня есть поле, которое содержит количество чего-либо, и IntegerField с опцией выбора, которая определяет, что означает это количество (длина, продолжительность и т. д.).
Должен ли я создать модель для единиц и физического количества или мне следует использовать IntegerField, который содержит тип единицы?






Это зависит от того, как вы хотите его использовать. Допустим, у вас есть значение длины и две возможные единицы: см и мм. Если вы хотите только распечатать значение позже, вы всегда можете распечатать его как [value] [unit].
Однако, если вы хотите выполнить некоторые вычисления со значением, например, вычислить площадь, вам необходимо преобразовать значения в те же единицы. Так что вам все равно нужно определить таблицу преобразования единиц.
Я бы преобразовал единицы в ту же внутреннюю единицу перед, которую я храню в базе данных, вместо того, чтобы конвертировать их каждый раз, когда я их использую.
Я бы добавил модель для единиц и физических величин, только если их слишком много и преобразование действительно сложно. Такая модель могла работать как преобразователь. Но для простых случаев, таких как mm⇒cm или inch⇒cm, достаточно статической таблицы преобразования.
Под field(enum) вы имеете в виду, что используете опцию выбор в поле?
Простой набор вариантов достаточно хорошо работает для небольших списков конверсий. Это позволяет вам делать упрощающие предположения, которые помогают вашим пользователям (и вам) получить что-то, что работает.
Создание формальной модели для единиц должно выполняться только в том случае, если у вас есть (а) МНОГО задействованных единиц, (б) вам необходимо ее расширить, И (в) есть некоторое рациональное ожидание, что поиск в БД будет иметь некоторую ценность.
Единицы не так уж часто меняются. Кажется, нет причин использовать для этого базу данных. Кажется, намного проще жестко запрограммировать список вариантов.
Выбор
Вы можете, например, использовать что-то подобное для отслеживания конверсий.
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" )
Модель.
Если вы хотите создать формальную модель для единиц, вы должны иметь при себе тип измерения (длина, объем, масса, вес / сила, давление, температура и т. д.) И различные коэффициенты преобразования единиц. Это работает для всего, кроме температуры, где у вас есть постоянный член в дополнение к коэффициенту.
Вы должны выбрать «базовый» набор единиц (например, МКС) и перенести все множители между различными единицами.
Вы также должны выбрать, сколько имперских единиц загружать в таблицу (жидкие унции, чайные ложки, столовые ложки, чашки, пинты, кварты и т. д.)
@Evgeny Lazin: Пожалуйста, дополните свой вопрос всеми дополнительными фактами.
Используйте поле, которое указывает тип меры (вес, длина и т. д.), И сохраните значение в другом поле. Этого должно быть достаточно. Единица измерения должна быть неявной. Я предполагаю, что вы используете одну и ту же единицу измерения для каждого типа измерения, например, для длины всегда метры.
Конкретный пример: допустим, у вас есть две сущности: «Машина» и «CarMeasures». Я бы написал модель так:
class Car(models.Model):
type=models.CharField(max_length=256);
class CarMeasures(models.Model):
carId=models.ForeignKey(Car);
measureValue=models.DecimalField(..., max_digits=10, decimal_places=2);
measureType=models.CharField(max_length=32);
Да, я имею в виду IntegerField с опцией выбора.