2012-06-19 100 views
1

我在django應用程序中有一個表,其中一個字段被稱爲Order(按排序順序)並且是一個整數。每次輸入新記錄時,字段自動增加到下一個數字。我的問題是何時刪除一條記錄我希望其他記錄將數字向上移動,並找不到任何可重新計算表中所有記錄的內容,並在記錄被刪除時向上移動數字。Django/Python中的自動遞增字段

例如,表中有5條記錄,其中訂單號爲1,2,3,4和5.有人刪除了記錄號2,現在我希望數字3,4和5向上移動刪除的數字2的地方,所以訂單號碼現在是1,2,3和4。python,postgres和django可能嗎?

在此先感謝!

+0

你爲什麼要這個?這可能會嚴重影響外鍵...... – McKay

+0

@McKay我已經在下面回答說,這個表與任何其他表都沒有關係。 fk從哪裏來的? – us1415

+1

哦,我發現這個問題是在搜索ID,而你並沒有在尋找ID。 – McKay

回答

2

這裏是我最終使用:

item.delete() 
items = table.objects.order_by('order') 
count =0 
for element in items: 
    element.order = count 
    element.save() 
    count=count+1 
-1

嘗試使用pgadmin在postgres中設置類型sequence的值。

+0

謝謝。當它們中的一個被刪除時,它會將這些數字轉移嗎? – us1415

+0

mmmm ...不,這不是自動增量 – juankysmith

4

你將不得不自己實現這個特性,我非常懷疑一個關係數據庫會爲你做這件事,並且有很好的理由:這意味着當一行被刪除時更新可能的大量行。

您確定需要這個?它可能會變得昂貴。

+0

此表是一個非常小的表,其行數少於10行,並且該字段與任何其他表無關。它的功能是爲下拉列表提供排序。 – us1415

+4

如果只是爲了排序,爲什麼你在乎它是否完全順序?包含缺失項目的序列也可以排序。 –

+0

因爲我在屏幕上的列表中顯示這個數字,並且不想在屏幕上顯示缺少的數字。此外,編輯時,我會顯示所有記錄,用戶將能夠更改文本,但訂單號碼不會更改。 – us1415

0

而不是刪除訂單 - 你應該創建一個布爾型的字段(無論你喜歡怎麼稱呼它 - 例如,deleted),並將此字段設置爲1以獲取「已刪除」訂單。

與串行字段混淆(這是你的自動增量字段在postgres中調用)將導致後來的問題;特別是如果你有外鍵和與表的關係。

不僅會影響數據庫服務器的性能,它也會影響到您的業務,因爲最終您將有兩個訂單在相同的訂單號碼周圍浮動;即使你已經從數據庫中「刪除」了一個,訂單號碼可能已經被其他地方引用了 - 就像你爲你的客戶打印的收據一樣。

+0

就像我對其他答案進行了評論。該字段僅用於對下拉列表進行排序。它與任何其他表格無關,我希望它是乾淨的,不會遺漏任何中間的序列號。 – us1415

0

您可以嘗試使用signals post_save和post_delete查詢適當的對象,對它們進行排序,然後查找缺失的數字並根據需要重新指定/保存。對於大量的數據來說這可能相當繁重,但只有少數幾乎不會改變的項目,這樣可以。

from django.db.models.signals import post_delete 
from django.dispatch import receiver 

def fix_order(sorted_objects): 
    #ensures that the given objects have sequential order values from 1 upwards 
    i = 1 
    for item in sorted_objects 
     if item.order != i: 
      item.order = i 
      item.save() 
     i += 1 

@receiver(post_delete, sender=YourSortedModel) 
def update_order_post_delete(sender, kwargs): 
    #get the sorted items you need 
    sort_items = YourSortedModel.objects.filter(....).order_by('order') 
    fix_order(sort_items) 
1

你可能最好只在表中留下值並使用查詢來生成編號。如果您正在編寫一些SQL,則可以使用窗口函數來執行此操作。

SELECT 
    output_column, 
    ..., 
    row_number() over (
    order by 
     order_column) 
FROM 
    TheTable; 
0

我碰到這個跑來找別的東西,想點東西出來:

通過在同一個字段存儲的順序表作爲你的數據,你失去了數據的完整性,或者如果你索引它,如果你遇到衝突,事情會變得非常複雜。換句話說,有一個bug(或別的東西)很容易給你兩個3,一個4,還有其他奇怪的事情會發生。我繼承了一個對應用程序至關重要的手動排序順序的項目(還有其他一些問題),這一直是個問題,只有200-300個項目。

處理手動排序順序的正確方法是使用單獨的表來管理它並使用連接進行排序。這樣,您的訂單表就會有10個條目,只有它是PK(訂單號),並且與您要分類的項目的ID有外鍵關係。刪除的項目將不再有參考。

您可以繼續對刪除進行排序,與您現在的操作方式類似,您只需將Order模型的FK更新爲列表,而不是迭代並重寫所有項目。效率更高。

這可以輕鬆擴展至數百萬個手動排序的項目。但不是使用自動遞增的整數,你會想給每個項目之間的兩個項目之間的一個隨機順序編號,你要把它放在它們之間,並保持足夠的空間(幾十萬應該這樣做),所以你可以任意重新編輯,整理它們。

我看到你提到你在這裏只有10行,但設計你的架構第一次很好地擴展,作爲一種實踐,將會讓你頭痛不已,一旦你養成了習慣它,它不會真的讓你有更多的時間。