2012-10-23 16 views
0

我有一个产品列表(比如diodoes),它们有一条与它们相关的曲线。 例如,在django模型中存储曲线很多吗?

  • 二极管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) 
    

是多对多前进的道路?即使每个二极管对应一条曲线? (但许多点,可能是两个共享相同点的二极管)。

任何意见,提示或工具链接,非常感谢。

+0

你希望增加在曲线或二极管的字段的数量?你真的需要查询“哪些二极管共享同一个点”? –

+0

我不需要查询“哪些二极管共用同一个点”。我不确定我了解“增加字段数”的问题。我可以添加“电压”或“认证”,但这是无关的。我可以有一个简单的曲线(有几点),也可以从供应商那里获得100分。这可能发生。 – Massagran

+0

我的意思是说,如果你有很多领域和JOIN操作,它们会非常浪费。如果你不需要这种灵活性,你可能不需要使用几种模型。 –

回答

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

+2

或使用http://pypi.python.org/pypi/django-picklefield –

+0

不知道它存在,谢谢! – Zashas

+0

谢谢。这似乎是一个快速和简单的解决方案。在引入后,我无法在管理员中看到PickledObjectField,但会进行调查。 – Massagran

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) 

只是为了灵活性小建议

+0

对不起。 N00b的问题。这提供了什么样的灵活性?什么是典型情况下,我需要额外的水平?谢谢 – Massagran

相关问题