我正在阅读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
那么,有人可以向我解释这个吗?我很困惑。谢谢!
答案 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