Django 中的同步模型实例

Synchronized Model instances in Django

我正在为 Django 项目(我的第一个 Django 项目)构建模型并注意到 Django 模型的实例不同步。

a_note = Notes.objects.create(message="Hello")  # pk=1
same_note = Notes.objects.get(pk=1)

same_note.message = "Good day"
same_note.save()

a_note.message  # Still is "Hello"

a_note is same_note  # False

是否有内置方法可以使具有相同主键的模型实例成为 同一个对象?如果是,(如何)保持所有的全局一致状态 模型对象,即使在批量更新或更改外键的情况下 从而使项目 enter/exit 相关集?

我可以想象模型 class 中的某种注册表,它至少可以处理简单的情况(即在批量更新或外键更改的情况下它会失败)。但是,静态注册表使测试更加困难。

我打算构建具有高级功能的(领域)模型来完成复杂的工作 超越简单 CRUD 的操作 Django 的 Model class 的动作。 (我的一些 class 模型 个实例 Django 的 Model subclass,而不是 subclass 的一个实例。这个 设计是为了防止直接访问可能破坏一致性的数据库,并将业务逻辑与纯数据访问相关的 Django Model 分开。)复杂的操作可能会触及和修改多个组件。作为开发者 使用模型 API,无法知道哪些组件在更新后已过时 调用一个复杂的操作。自动同步的实例可以缓解这个问题。还有其他方法可以克服这个问题吗?

TL;DR "Is there a built-in way to make model instances with the same primary key to be the same object?" .

内存中的 python 对象与数据库中的行不同。因此,当您创建 a_note 然后从数据库中获取 same_note 时,它们是 内存中的两个不同对象 ,即使它们是底层行的相同表示在你的数据库中。当您获取 same_note 时,实际上,您 实例化 一个新的 Notes 对象并使用从数据库获取的值初始化它。

然后您更改并保存 same_note,但内存中的 a_note 对象没有更改。如果您执行 a_note.refresh_from_db(),您会看到 a_note.message 已更改。

现在 a_note is same_note 将永远是 False 因为这两个对象在内存中的位置总是不同的。如果两个变量 指向 内存中的同一个对象,则它们是相同的(is 为真)。

但是 a_note == same_note 会在任何时候 return True,因为 Django 定义两个模型实例是相等的 如果它们的 pk 相同.

请注意,如果您所说的复杂性是在多个请求的情况下,一个请求可能会更改另一个请求正在使用的基础值,那么请使用 Favoid race conditions .

在一个请求中,因为一切都是顺序的和单线程的,所以不存在变量不同步的风险:你知道事情完成的顺序,因此当你知道一个时总是可以调用 refresh_from_db()先前的方法调用可能已更改数据库值。

另请注意:让两个变量保存同一行意味着您将对数据库执行两次查询,这是您要不惜一切代价避免的一件事。所以你首先应该想想为什么会出现这种情况。