2009-01-09 90 views
12

我有一個非常簡單的問題。我需要創建代表有序列表元素的模型。這種模式可以實現這樣的:在django訂購列表

class Item(models.Model): 
    data = models.TextField() 
    order = models.IntegerField() 

或像這樣:

class Item(models.Model): 
    data = models.TextField() 
    next = models.ForeignKey('self') 

什麼方法最好?每種解決方案都有什麼缺點?

+0

嗨!我遇到了同樣的問題。我想到的一個解決方案是在'解決方案1'中使用該模型。但不是移動所有東西,我只是改變了'重新排列的項目'的價值。 例如,我想在訂單9和訂單10之間的商品之間移動商品,我只需將商品的訂單更改爲9.5。你覺得這對長桌來說可能不好嗎? – 2015-09-01 07:18:47

回答

20

本質上,您提出的第二種解決方案是鏈接列表。在數據庫級別實現的鏈接列表通常不是一個好主意。要檢索n元素的列表,您需要訪問n數據庫(或使用複雜的查詢)。性能明智的是,檢索O(n)中的列表非常不高效。

在常規代碼中,鏈接列表與數組相比用於獲得更好的插入性能(無需移動所有元素)。在你的數據庫,更新所有內容並不複雜只有2查詢:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3 
INSERT INTO item (order, ...) VALUES (3, ...) 

我記得看到一個可重複使用的應用程序,實現這一切,一個很好的管理界面,但我現在不能找到它......

總結一下,除非你有一個非常好的理由,否則就應該首先使用解決方案#1並遠離解決方案#2!

+0

這是你提到的應用程序嗎? http://nyquistrate.com/django/orderedlist/ – 2012-04-06 23:13:53

6

這取決於你想要做什麼。

第一個似乎更好地使數據庫中的單個查詢,並得到正確的順序

第二個似乎更好地插入現有的兩個元素之間的元素(所有數據,因爲在第一個你」如果數字是連續的,則必須更改很多項目)

我會使用第一個,因爲它似乎更適合數據庫表,這是django如何將模型數據存儲在引擎蓋後面。

-6

還有另一種解決方案。

class Item(models.Model): 
    data = models.TextField() 

您可以將Python列表醃菜或編入數據字段並加載它。這是一個很好的更新和閱讀,但不適合搜索例如獲取包含特定項目的所有列表。