Django模型save()保留了JSONFields()的可变引用。

问题描述 投票:1回答: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))

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

django django-models django-jsonfield
1个回答
0
投票

保存一个模型后,模型不应该从db刷新吗?

不,它 暮气沉沉. 它只是使 CREATEINSERT INTO 语句在数据库中。所以这里会是这样的。

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

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

如果主键是一个 AutoField (或 BigAutoField),它也会在第一次保存对象时设置该对象的主键。

如同在 保存对象 文件部分:

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

(…)

模型保存过程也有一些微妙的地方,请看下面的章节。

自动递增主键

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

© www.soinside.com 2019 - 2024. All rights reserved.