2011-09-20 42 views
1

這看起來很簡單。Django管理模式保存 - 更新現有的對象

在我的模型save()我想基本上做一個get_or_create()。所以我想更新模型,如果它存在或創建一個新的,如果不存在。

這似乎是一個超級簡單的問題,但我沒有得到它的權利!

class StockLevel(models.Model): 
    stock_item = models.ForeignKey(StockItem) 
    current_stock_level = models.IntegerField(blank=True, default=0) 

    def save(self): 
     try: 
      # it exists 
      a = StockLevel.objects.get(stock_item=self.stock_item) 
      a.current_stock_level = self.current_stock_level 
      a.save() 

     except: 
      # is does not exist yet 
      # save as normaly would. 
      super(StockLevel, self).save() 

OR

def save(self): 
    stock_level_item , created = StockLevel.objects.get_or_create(stock_item=self.stock_item) 
    stock_level_item.current_stock_level = self.current_stock_level 
    stock_level_item.save() 

這也將進入一個無限循環。

這會將save()放在一個無限循環中。但這是它應該如何工作的基本思想。

+0

請顯示一些代碼。 –

回答

5

Django使用相同的save()方法來創建和更新對象。 用戶代碼不需要確定是創建還是更新對象,因爲這是由方法本身完成的。

此外,您可以強制save()方法通過使用方法可選參數來創建或更新對象。

這涵蓋在Django docs

+2

此外,如果你想檢查對象是否已經保存過,你可以在'save()'方法中檢查它是否有主鍵。 「如果self.pk:...'的話。但是,由於gagamil回答更新vs插入由Django自己照顧。 – modocache

1

這聽起來並不是最好的方法。 save方法用於保存當前實例,而不是神奇地查詢現有實例。您應該在表單或查看代碼中注意這一點。