2011-09-20 81 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方法用于保存当前实例,而不是神奇地查询现有实例。您应该在表单或查看代码中注意这一点。