Django管理模型保存 - 更新现有对象

Har*_*rry 1 django django-models django-admin

这看起来很简单.

在我的模型上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()
Run Code Online (Sandbox Code Playgroud)

要么

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()
Run Code Online (Sandbox Code Playgroud)

这也将进入无限循环.

这只会将save()置于无限循环中.但这是它应该如何运作的基本思路.

gag*_*mil 5

Django使用相同的save()方法来创建和更新对象.用户代码不需要确定是创建还是更新对象,因为这是由方法本身完成的.

此外,您可以使用方法可选参数强制save()方法创建或更新对象.

这在Django文档中有所介绍.

  • 此外,如果您想检查对象之前是否已保存,您可以在`save()`方法中检查它是否有主键.有点像`if self.pk:......`.但正如gagamil回答更新vs插入由Django本身照顾. (2认同)