Django и преобразование единиц измерения

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

Должен ли я создать модель для единиц и физического количества или мне следует использовать IntegerField, который содержит тип единицы?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 966
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это зависит от того, как вы хотите его использовать. Допустим, у вас есть значение длины и две возможные единицы: см и мм. Если вы хотите только распечатать значение позже, вы всегда можете распечатать его как [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" )

Модель.

Если вы хотите создать формальную модель для единиц, вы должны иметь при себе тип измерения (длина, объем, масса, вес / сила, давление, температура и т. д.) И различные коэффициенты преобразования единиц. Это работает для всего, кроме температуры, где у вас есть постоянный член в дополнение к коэффициенту.

Вы должны выбрать «базовый» набор единиц (например, МКС) и перенести все множители между различными единицами.

Вы также должны выбрать, сколько имперских единиц загружать в таблицу (жидкие унции, чайные ложки, столовые ложки, чашки, пинты, кварты и т. д.)

Да, я имею в виду IntegerField с опцией выбора.

Evgeny Lazin 05.01.2009 20:37

@Evgeny Lazin: Пожалуйста, дополните свой вопрос всеми дополнительными фактами.

S.Lott 05.01.2009 21:42

Используйте поле, которое указывает тип меры (вес, длина и т. д.), И сохраните значение в другом поле. Этого должно быть достаточно. Единица измерения должна быть неявной. Я предполагаю, что вы используете одну и ту же единицу измерения для каждого типа измерения, например, для длины всегда метры.

Конкретный пример: допустим, у вас есть две сущности: «Машина» и «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);

Другие вопросы по теме