2017-02-27 66 views
2

我問自己這個問題,models.py和views.py中的方法有什麼區別和更高性能?Django:模型中的方法vs視圖中的方法

實施例1:

models.py:

class Counter(models.Model): 
    number = models.PositiveSmallIntegerField(default=0) 

    def add_one(self): 
     self.number += 1 
     self.save() 

views.py

from *xxx* import Counter 

def count(request): 
    c = Counter() 
    c.add_one() 
    c.save() 
    return render(request, *xxx*) 

實施例2:

models.py:

class Counter(models.Model): 
    number = models.PositiveSmallIntegerField(default=0) 

views.py

from *xxx* import Counter 

def add_one(nb): 
    nb += 1 
    return nb 

def count(request): 
    c = Counter() 
    c.number = add_one(c.number) 
    return render(request, *xxx*) 

我的例子有點簡單,但什麼大法等許多在現實生活中的區別變量?

它對服務器的性能有影響嗎?他有沒有常規或偏好選擇一種方式?

+1

爲什麼會有任何性能差異?代碼是代碼,不管你放在哪裏。 –

+1

第二個會更快,因爲你永遠不會將它保存到數據庫,除了他們做同樣的事情 – Sayse

+0

你可以閱讀[here](https://docs.djangoproject.com/en/1.10/topics/performance /#get-things-right-from-the-start)你有不同的可能性,它在框架上的不同層次上工作,它的速度和速度都不一樣。我試圖找到優化我的代碼的好方法。 – Buky

回答

4

兩種方法都是錯誤的!

正確的方法是

Counter.objects.filter(pk=some_id).update(number=F('number')+1) 

注意,需要這種方法來避免競爭狀態。您目前的方法需要交易才能正常工作。像上面這樣的代碼通常會進入視圖。

+0

謝謝你的答案,但增量是一個簡單的例子,在實踐中,我做了很多過程非常重複,在輸入用戶之前進行許多處理,然後將其保存在數據庫中。所以我知道更新更好,但我發現一個例子非常簡單。 – Buky

+0

在實踐中「是」你回答我的例子。但是,這個問題只是更理想:「如果我理解你說視圖方法,models.py和views.py'中的方法之間有什麼不同和性能更好。 – Buky

+0

仍然你的意見是無關緊要的。因爲你發佈的代碼只是錯誤的做法。我建議你發佈另一個問題,但在此之前。請閱讀: http://stackoverflow.com/help/how-to-ask – e4c5