2010-02-09 176 views
2

以爲我這個小模型:Django的,從模型更新

class Deal(models.Model): 
    purchases = models.IntegerField(default=0)#amount of purchases so far 

    increase_purchases(self,to_add): 
     self.update(purchases =self.purchases + to_add) 

,當我嘗試使用這個從殼increase_purchases型號:

>>> x = Deal.objects.get(id=1) 
>>> x.increase_purchases(4) 
AttributeError: 'Deal' object has no attribute 'update' 

我如何寫一個適當的功能模型以便我可以根據需要更新所選查詢的購買情況?

回答

3

根據您的例子和說明,你可能想是這樣的:

class Deal(models.Model):   
    purchase_count = models.IntegerField(default=0) 

    def purchase(self, quantity=1): 
     self.purchase_count = self.purchase_count + quantity 

我伊格納西奧同意;修改對象然後保存它。所以在外殼上:

> great_deal = Deal.objects.get(id=1) 
> great_deal.purchase(4) 
> great_deal.save() 
> # or w/o an explicite argument it will record a single purchase 
> # great_deal.purchase() 

是的,我在Deal模型中重新命名了一些東西。這看起來更具描述性。

1

修改相應的字段,然後在實例上調用save()

+0

但據我所知保存將保存一個新的實例,而我想更新現有的。視爲 – Hellnar 2010-02-09 05:53:05

+0

如果PK爲「無」或數據庫中不存在,它將僅創建一條新記錄。否則它會用上述PK更新現有記錄。 – 2010-02-09 05:55:07

1

或者使用更清潔的代碼+ =表達式:

class Deal(models.Model):   
    purchase_count = models.IntegerField(default=0) 

    def purchase(self, quantity=1): 
     self.purchase_count += quantity 
+1

是的,但是你如何在其他人可能也在做同樣的事情的情況下完成這項工作? – Alper 2013-03-30 20:02:45

1

在Django中1.6.2。遇到此行爲並使用「過濾器」,然後更新按預期工作。例如,學生.objects.select_for_update()。filter(id = 3).update(score = 10)

只是:除非您正在處理事務,否則使用save()單獨修改每個字段可能會導致數據不一致一個多線程環境。在threadA調用save()的時候,另一個threadB可能已經改變了模型字段並保存了。在這種情況下,threadA必須讀取更新後的模型並進行更改。