1
# Model contains only one JSON field
class TestModel(models.Model):
    field = JSONField(default=dict)

# Dictionary, assigned to model.field
field_json = {"test": 5}
model = TestModel(field = field_json)
model.save() 

# Returns true. WHY???
print(id(model.field) == id(field_json))

保存模型后,模型不应该从数据库刷新吗?为什么模型字段保留对原始字典对象的可变引用?

4

1 回答 1

0

保存模型后,模型不应该从数据库刷新吗?

不,它没有刷新。它只是在数据库中创建一个CREATEorINSERT INTO语句。所以这里看起来像:

INSERT INTO appname_test_model (field) VALUES ('{"test": 5}');

就是这样,对象保持不变。事实上,例如,如果你有 aDecimalField并且你分配给它一个int,它仍然是一个int

如果主键是 an AutoField(或 a BigAutoField),它还会在第一次保存该对象时设置该对象的主键:

如文档的保存对象部分中所述

要将对象保存回数据库,请调用save().

(……)

模型保存过程也有一些微妙之处;请参阅以下部分。

自增主键

如果一个模型有一个AutoField——一个自动递增的主键——那么这个自动递增的值将在你第一次调用时被计算并保存为你的对象的一个​​属性save()

于 2020-06-10T18:33:22.487 回答