Django和单位转换

时间:2009-01-05 15:27:38

标签: python django

我需要在数据库,距离,重量等中存储一些值。在我的模型中,我有一个包含数量的字段和IntegerField whith choices选项,它决定了这个数量的含义(长度,持续时间等)。我应该为单位和物理量创建模型还是应该使用包含单位类型的IntegerField?

3 个答案:

答案 0 :(得分:4)

“field(enum)”是指你在字段上使用choices选项吗?

对于小型转化列表,一组简单的选择非常合理。它允许您简化假设,帮助您的用户(和您)获得有用的东西。

只有当你有(a)涉及很多单位,(b)你需要扩展它时,才能创建单位的正式模型。(c)有一些理性的期望,DB查找将是一些值。

单位不会经常改变。似乎没有理由为此使用数据库。对选择列表进行硬编码似乎要简单得多。

<强>选择

例如,您可以使用类似的内容来跟踪转化。

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 :(得分:1)

这取决于您想要如何使用它。假设您有长度值和两个可能的单位,cm和mm。如果您只想稍后打印该值,则可以始终将其打印为 单位

但是,如果要对值进行一些计算,例如计算面积,则需要将值转换为相同的单位。所以你必须定义单位转换表。

我会在将它们存储在数据库中之前将单位转换为相同的内部单位,而不是每次使用它们时都转换它们。

我会为单位和物理数量添加一个模型,只要它们太多并且转换真的很棘手。这种模型可以作为转换器。但对于简单的情况,如mm⇒cm或inch⇒cm,静态转换表就足够了。

答案 2 :(得分:1)

使用指示度量类型(权重,长度等)的字段,并将值存储在另一个字段中。这应该足够了。衡量单位应该是隐含的。 我假设您对每种度量类型使用相同的度量单位,例如总是米长度。

一个具体的例子:假设你有两个实体,“ 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);