Django y conversión de unidades

Necesito almacenar algunos valores en la base de datos, la distancia, el peso, etc. En mi modelo, tengo un campo que contiene cantidad de algo y la opción de opciones IntegerField, que determina qué significa esta cantidad (duración, duración, etc.). ¿Debo crear un modelo para unidades y cantidad física o debo usar IntegerField que contiene el tipo de unidad?

Por “campo (enumeración)” ¿quiere decir que está utilizando la opción de opciones en un campo?

Un conjunto simple de opciones funciona razonablemente bien para pequeñas listas de conversiones. Le permite hacer suposiciones simplificadoras que ayudan a sus usuarios (y a usted) a obtener algo que funciona.

La creación de un modelo formal para unidades solo debe hacerse si tiene (a) MUCHA unidad involucrada, (b) su necesidad de extenderlo, Y (c) hay una expectativa racional de que las búsquedas de DB serán de algún valor.

Las unidades no cambian tan a menudo. Parece que hay pocas razones para usar la base de datos para esto. Parece mucho más sencillo codificar la lista de opciones.

Opciones

Puede, por ejemplo, usar algo como esto para hacer un seguimiento de las conversiones.

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. } 

Dada esta asignación, puede obtener un factor de conversión en su función de método de conversión, hacer los cálculos y devolver la unidad convertida.

 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" ) 

Modelo

Si desea crear un modelo formal para las unidades, debe tener en cuenta el tipo de dimensión (longitud, volumen, masa, peso / fuerza, presión, temperatura, etc.) y los factores de conversión de la unidad varous. Esto funciona para todo menos la temperatura, donde tiene un término constante además de un factor.

Tienes que elegir un conjunto de unidades “base” (por ejemplo, MKS ) y llevar todos los multiplicadores entre las distintas unidades.

También tiene que elegir cuántas unidades inglesas cargar en su mesa (onzas líquidas, cucharaditas, cucharadas, tazas, pintas, cuartos de galón, etc.)

Depende de cómo quieras usarlo. Digamos que tienes un valor de longitud y dos unidades posibles, cm y mm. Si solo desea imprimir el valor más adelante, siempre puede imprimirlo como unidad de valor .

Sin embargo, si desea hacer algunos cálculos con el valor, por ejemplo, calcular el área, debe convertir los valores a las mismas unidades. Así que tienes que definir la tabla de conversión de unidades de todos modos.

Convertiría las unidades a la misma unidad interna antes de almacenarlas en la base de datos, en lugar de convertirlas cada vez que las uso.

Yo agregaría un modelo para unidades y cantidades físicas solo si hay demasiados y la conversión es realmente difícil. Tal modelo podría funcionar como un convertidor. Pero para casos simples, como mm⇒cm o inch⇒cm, una tabla de conversión estática sería suficiente.

Use un campo que indique el tipo de medida (peso, longitud, etc.) y almacene el valor en otro campo. Eso debería ser suficiente. La unidad de medida debe ser implícita. Supongo que está utilizando la misma unidad de medida para cada tipo de medida, por ejemplo, siempre metros para la longitud.

Un ejemplo concreto: digamos que tiene dos entidades, ” Car ” y ” CarMeasures “. Yo escribiría el modelo de esta manera:

 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);