2012-10-23 17 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

相關問題