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