2010-07-31 27 views
3

在Django應用我需要創建一個順序號,它看起來像:yyyymmddnnnn其中YYYY =年,mm =月,dd =日期和nnnn是1到9999Django中,訪問的PostgreSQL序列

之間的數

我想我可以使用PostgreSQL序列,因爲生成的數字是原子的,所以我可以確定何時該進程獲得的數字是唯一的。

所以我創建了一個PostgreSQL的序列:

CREATE SEQUENCE order_number_seq 
INCREMENT 1 
MINVALUE 1 
MAXVALUE 9999 
START 1 
CACHE 1 
CYCLE; 

該序列可作爲具有一排表進行訪問。所以在checkout.py文件中,我創建了一個Django模型來訪問這個序列。

class OrderNumberSeq(models.Model): 
    """ 
    This class maps to OrderNumberSeq which is a PostgreSQL sequence. 
    This sequence runs from 1 to 9999 after which it restarts (cycles) at 1. 
    A sequence is basically a special single row table. 
    """ 
    sequence_name = models.CharField(max_length=128, primary_key=True) 
    last_value = models.IntegerField() 
    increment_by = models.IntegerField() 
    max_value = models.IntegerField() 
    min_value = models.IntegerField() 
    cache_value = models.IntegerField() 
    log_cnt = models.IntegerField() 
    is_cycled = models.BooleanField() 
    is_called = models.BooleanField() 

    class Meta: 
     db_table = u'order_number_seq' 

我將sequence_name設置爲主鍵,因爲Django堅持在表中具有主鍵。

的我創建了內容的文件get_order_number.py:

def get_new_order_number(): 
    order_number = OrderNumberSeq.objects.raw("select sequence_name, nextval('order_number_seq') from order_number_seq")[0] 

    today = datetime.date.today() 
    year = u'%4s' % today.year 
    month = u'%02i' % today.month 
    day = u'%02i' % today.day 

    new_number = u'%04i' % order_number.nextval 
    return year+month+day+new_number 

現在,當我打電話從它的行爲與預期Django的交互shell「get_new_order_number()」。

>>> checkout.order_number.get_new_order_number() 
u'201007310047' 
>>> checkout.order_number.get_new_order_number() 
u'201007310048' 
>>> checkout.order_number.get_new_order_number() 
u'201007310049' 

每次調用該函數時,都會看到數字很好地遞增1。您可以啓動多個交互式Django會話,並且數字很好地增加,不同會話中出現的數字不會相同。

現在我嘗試使用從視圖中調用這個函數如下:

import get_order_number 

order_number = get_order_number.get_new_order_number() 

,它給了我一個號碼。然而,當我下次訪問視圖時,它將數字加2。我不知道問題出在哪裏。

+0

我認爲我們需要從您的視圖代碼中看到更多。 – KillianDS 2010-08-01 08:29:50

+0

基本上沒有更多的視圖代碼。但我已經改變了我的想法如何生成訂單號碼。我需要生成唯一的訂單號碼,以便在必要時跟蹤訂單。而我嘗試的方式有一個嚴重的缺點。我必須在正午的時候每天重置櫃檯。無論如何,所有你們都感謝迴應。 – Henri 2010-08-01 20:04:16

+0

看來錯誤出現在應用程序的另一部分,所以問題解決了。我讀了一些關於生成訂單號的地方:http://stackoverflow.com/questions/1179439/best-way-to-generate-order-numbers-for-an-online-store,這裏有一些非常有用的提示。 – Henri 2010-08-02 22:46:43

回答

3

我能想出的最佳解決方案是:不要擔心,如果您的訂單號碼稀疏。如果缺少訂單號碼應該沒有關係:沒有辦法確保訂單號碼是連續的,在某些時候不會受到競爭條件的影響。

你最大的問題可能是說服那些尖角的人有'缺少'訂單號碼不成問題。

欲瞭解更多詳情,請參閱SQL Antipatterns中的Psuedo-Key Neat Freak條目。 (請注意,這是一本書的鏈接,其全文不可免費獲取)。