2010-06-30 43 views
1
def __number(): 
    # This line returns the number of the latest created object 
    # as a "Factura" object in format "n/year" 
    last = Factura.objects.filter(f_type__exact=False).latest('number') 

    # We convert it into a string and split it to get only the first number 
    spl = str(last).split('/')[0] 

    # Convert it into integer so we can do math 
    n = int(spl) 

    # Get the current year 
    y = date.today().strftime('%y') 

    # If none return 1/year 
    if n == None: 
     return str(1) + '/' + str(y) 

    # Else we increment the number in one. 
    else: 
     n = n + 1 
     return str(n) + '/' + str(y) 

它做什麼:它會自動生成格式爲'1/year''2/year'的數字等等。如果用戶引入了其他數字,p.e. 564/10功能跟隨它,下一個將是565/10。任何方式來改善這個python函數?

即使用戶介紹p.e.在與564/10的輸入之後的34/10功能將遵循最大數量。

我做對了嗎?還是有更好的方法來做到這一點?


更新:

def __number(): 
    current_year = date.today().strftime('%y') 
    try: 
     facturas_emmited = Factura.objects.filter(f_type__exact=False) 
     latest_object = facturas_emmited.latest('number').__str__() 
     first_number = int(latest_object.split("/")[0]) + 1 
    except Factura.DoesNotExist: 
     first_number = 1 
    return '%s/%s' % (first_number, current_year) 
+1

.....使用PERL! – 2010-06-30 20:00:31

+1

@Greg我最好自殺......嘿嘿。 Perl對我來說太高級了,也許將來我會試着去學習它。 – 2010-06-30 20:03:45

+2

不要使用裸''except'塊,只抓住你擔心的具體錯誤 – Daenyth 2010-06-30 20:37:36

回答

2

這真的只是一個開始,但我會開始用自我記錄代碼替換一些註釋。

def __number(): 
    # "Factura" object in format "n/year" 
    latest_object = Factura.objects.filter(f_type__exact=False).latest('number') 

    # Better name can be available if you explain why the first number is important and what it means 
    # Do Factura objects not have a __repr__ or __str__ method that you must cast it? 
    first_number = int(str(latest_object).split('/')[0]) 
    current_year = date.today().strftime('%y') 
    # Use "is None" rather than "== None" 
    if first_number is None: 
     return '1/%d' % current_year 
    # No else needed because of return above 
    # Why do we add 1 to first number? Comments should explain _why_, not how 
    return '%d/%d' % (first_number + 1, current_year) 
+0

只是在這裏解釋代碼的註釋,其實這個函數還沒有記錄(我的錯)。 BTW first_number不能爲None。 – 2010-06-30 20:31:49

+0

我可以使用'__str__'方法,但latest_object變量變得越來越大。我能做些什麼? – 2010-06-30 20:49:48

1

lastNone?如果是這樣的話,檢查一下會很好:

# get last as before 

if last: 
    n = int(str(last).split("/")[0]) + 1 
else: 
    n = 1 

# get y as before 

return str(n) + "/" + str(y) 

這裏的另一個改進是你只在一個地方建立結果字符串。

我不知道Factura對象是什麼,但是通過調用它的某些方法,您不能得到n的值嗎?這會比將其轉換爲字符串更好,將其拆分並取出最後一部分。

+0

'last'不能是None(如果沒有找到對象,它會引發一個DoesNotExist異常),但我可以將它包裝在一個try:... except子句中。我將把代碼放在問題中。另外,由於'number'是一個字符串,因此無法直接獲得'n'。 – 2010-06-30 20:24:03

0

我前段時間通過使用object.id/year(其中object/id是數據庫id)解決了類似的問題。

它保證這將是唯一的,自動增量(你不需要做n = n + 1,理論上可以導致重複的數據庫值)。

你可以通過覆蓋save方法來做到這一點,唯一的竅門是你需要先保存一個對象(id被分配),然後再創建id/year數字並再次保存(也許有更好的方法來做到這一點比雙倍保存)。

def save(self, force_insert = False, force_update = False): 
    super(Factura, self).save(force_insert, force_update) 
    current_year = date.today().strftime('%y') 
    self.identifier = '%s/%s'%(self.id, current_year) 
    super(Factura, self).save(force_insert, force_update) 
+0

是的,但在我的情況下,該方法有兩個問題:a)它爲每個Factura對象創建數字/年,而不是僅針對具有f_type = False的數字。 b)我的功能在現場被調用。默認(),所以只要添加一個對象,該字段就會自動填充數字。感謝無論如何的答案:) – 2010-07-01 09:55:01

+0

我只是想展示一些不同的方法。您可以輕鬆地修改此爲您的需求: 高清保存(個體經營,force_insert =假force_update = FALSE): 超(Factura,個體經營).save(force_insert,force_update) 如果self.f_type: CURRENT_YEAR =日期。今天()。strftime('%y') self.identifier ='%s /%s'%(self.id,current_year) super(Factura,self).save(force_insert,force_update) – dzida 2010-07-01 10:09:15

+0

BTW in my use情況下,用戶可以以1或任何其他數字開始(第一個對象可以是342/10),因此生成器必須遵循它。如果使用PK它只能遵循PK命令(342/10將成爲1/10) – 2010-07-01 10:21:11

相關問題