0

我有一个产品列表(比如二极管),它们有一条与之相关的曲线。例如,

  • 二极管 1:曲线 1:[(0,1),(1,3),(2,10), ...., (100,0.5)]
  • 二极管 2:曲线 2:[(0,2),(1,4),(2.1,19), ..., (100,0)]

因此,对于每个产品,都有一条曲线(具有相同的 x 轴值range(1,100))但不同的 y 轴值。

我的问题是存储此类数据(使用 Django + PostgreSql)的最佳实践是什么,因为我想稍后在视图中用它计算事物(比如曲线下的区域,或者曲线与另一个曲线相乘等)。我还将绘制图表,因此视图必须提取值。

我的第一次尝试有各种限制:

  • 天真的尝试 1

     # model.py
     for i in range(101):
         name_sects = ["x", str(i+1)]
         attrs["".join(name_sects)] = models.DecimalField(_("".join([str(i+1),' A'])), max_digits=6)
    
    
     attrs['intensity'] = model.DecimalField(_('Diode Intensity'))
    
    
     Diode = type('Diode', (models.Model,), attrs)
    

好的,这为每个“x”、x1、x2、...等创建了一个字段,我可以在管理员中填写每个“y”...但是如何在视图或模板中操作它并不明显。(显然,要填写很痛苦)

  • 天真的尝试 2

    #model.py
    class Curve(models.Model)
        x_axis = models.PositiveIntegerField( ...)
        y_axis = models.DecimalField( ...)
    
    class Diode(models.Model)
        name = blah, blah
        intensity = model.DecimalField(_('Diode Intensity'), blah, blah)
        characteristic_curve = model.ManyToManyField(Curve)
    

多对多是前进的方向吗?即使每个二极管对应一条曲线?(但很多点,可能两个二极管共享同一个点)。

非常感谢任何建议、提示或工具链接。

4

2 回答 2

1

如果你想提高速度(因为每个产品有 100 个条目,它真的很大,如果你必须获取 100 个产品和他们的积分会很慢),我会使用 pickle 模块并将你的元组列表存储在 TextField 中(或者如果字符串的长度没有改变,则可能是 CharField)。

>>> a = [(1,2),(3,4),(5,6),(7,8)]
>>> pickle.dumps(a)
'(lp0\n(I1\nI2\ntp1\na(I3\nI4\ntp2\na(I5\nI6\ntp3\na(I7\nI8\ntp4\na.'
>>> b = pickle.dumps(a)
>>> pickle.loads(b)
[(1, 2), (3, 4), (5, 6), (7, 8)]

只需将 b 存储在您的 TextField 中,您就可以非常轻松地取回您的列表。

甚至更好,正如罗伯特史密斯所说,使用http://pypi.python.org/pypi/django-picklefield

于 2012-10-23T16:23:50.110 回答
0

我喜欢你的第二种方法,但只是一个小建议。

class Plot(models.Model):
    x_axis = models.PositiveIntegerField( ...)
    y_axis = models.DecimalField( ...)

class Curve(models.Model)
   plots = models.ManyToManyField(Plot)

class Diode(models.Model)
    name = blah, blah
    intensity = model.DecimalField(_('Diode Intensity'), blah, blah)
    curve = models.ForeignKey(Curve)

只是对灵活性的一个小建议

于 2012-10-23T16:24:26.433 回答