django如何知道更新或插入

时间:2015-07-23 07:39:09

标签: django

我正在阅读django doc,看看django在调用save()时如何知道更新或插入方法。医生说: If the object’s primary key attribute is set to a value that evaluates to True (i.e. a value other than None or the empty string), Django executes an UPDATE. 如果未设置对象的主键属性或者UPDATE没有更新任何内容,则Django会执行INSERT link

但实际上,当我创建Model的新实例并将其“id”属性设置为我的数据库记录中已存在的值时。例如:我有一个名为“User”的Model类,并且有一个名为“name”的属性。如下所示:

class User(model.Model):
    name=model.CharField(max_length=100)

然后我创建一个新用户并保存它:

user = User(name="xxx")
user.save()

现在在我的数据库表中,存在id = 1,name =“xxx”之类的记录。 然后我创建一个新用户并设置propery id = 1:

newuser = User(id=1)
newuser.save()

不像doc说的那样。当我把它弄下来时。我在我的数据库表中查出了两条记录。一条是id = 1,另一条是id = 2

那么,有人可以向我解释这个吗?我很困惑。谢谢!

1 个答案:

答案 0 :(得分:0)

因为在较新版本的django(1.5>)中,django不会检查id是否在数据库中。所以这可能取决于数据库。如果数据库报告这是重复的,那么它将更新,如果数据库没有报告它,那么它将插入。检查doc -

  

在Django 1.5及更早版本中,Django在主键时执行了SELECT   属性已设置。如果SELECT找到了一行,那么Django做了一个   更新,否则它执行了INSERT。旧算法导致一个   更新案例中的更多查询。有一些罕见的情况   即使数据库,数据库也不会报告行已更新   包含对象主键值的行。一个例子是   PostgreSQL ON UPDATE触发器,返回NULL。在这种情况下它是   可以通过设置select_on_save恢复到旧算法   选项为True。

https://docs.djangoproject.com/en/1.8/ref/models/instances/#how-django-knows-to-update-vs-insert

但是如果您想要这种行为,请将select_on_save选项设置为True.

如果需要,您可能想尝试force_update -

https://docs.djangoproject.com/en/1.8/ref/models/instances/#forcing-an-insert-or-update