Джанго и конвертация единиц - PullRequest
1 голос
/ 05 января 2009

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

Ответы [ 3 ]

4 голосов
/ 05 января 2009

Под "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 ) и нести все множители между различными единицами.

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

1 голос
/ 05 января 2009

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

Конкретный пример: допустим, у вас есть две сущности: " Car " и " 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);
1 голос
/ 05 января 2009

Это зависит от того, как вы хотите его использовать. Допустим, у вас есть значение длины и две возможные единицы, см и мм. Если вы хотите напечатать значение позже, вы всегда можете напечатать его как значение единица .

Однако, если вы хотите выполнить некоторые вычисления со значением, например, вычислить площадь, вам необходимо преобразовать значения в те же единицы. Так что вы все равно должны определить таблицу перевода единиц.

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

Я бы добавил модель для единиц и физических величин только в том случае, если их слишком много, а преобразование действительно сложно. Такая модель может работать как конвертер. Но для простых случаев, таких как mm⇒cm или inch⇒cm, достаточно статической таблицы преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...