【问题标题】:Django Model save() retains mutable reference for JSONFields()Django 模型 save() 保留 JSONFields() 的可变引用
【发布时间】:2020-06-10 18:29:27
【问题描述】:
# 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))

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

【问题讨论】:

  • 否 对象未从数据库中刷新。它只是在数据库端更新记录。

标签: django django-models django-jsonfield


【解决方案1】:

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

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

<b>INSERT INTO</b> appname_test_model (field) VALUES ('{"test": 5}');

就是这样,对象保持不变。实际上,例如,如果您有一个 DecimalField 并且您为其分配了一个 int,它仍将是一个 int

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

Saving objects section of the documentation中指定:

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

(…)

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

主键自动递增

如果一个模型有一个AutoField——一个自动递增的主键——那么当你第一次调用@987654332时,那个自动递增的值将被计算并保存为你的对象的一个​​属性 @。

【讨论】:

  • 谢谢威廉。但是,例如一个没有 pk 的模型,在保存后会分配一个 pk。这个id不是来自数据库吗?那么在那种情况下,对象其实是不一样的吧?
  • @NeilSanghrajka:是的,它确实会选择最新分配的主键,但这是从数据库返回的唯一内容。
  • 谢谢!我试图找到解释这种行为的 Django 文档。如果您可以向我指出一些文档,那就太棒了!再次感谢你!
猜你喜欢
  • 2013-05-11
  • 2012-05-19
  • 2022-11-05
  • 2015-03-27
  • 1970-01-01
  • 2011-11-08
  • 2012-02-21
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多