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
相同.
请注意,如果您所说的复杂性是在多个请求的情况下,一个请求可能会更改另一个请求正在使用的基础值,那么请使用 F
到 avoid race conditions .
在一个请求中,因为一切都是顺序的和单线程的,所以不存在变量不同步的风险:你知道事情完成的顺序,因此当你知道一个时总是可以调用 refresh_from_db()
先前的方法调用可能已更改数据库值。
另请注意:让两个变量保存同一行意味着您将对数据库执行两次查询,这是您要不惜一切代价避免的一件事。所以你首先应该想想为什么会出现这种情况。
我正在为 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
相同.
请注意,如果您所说的复杂性是在多个请求的情况下,一个请求可能会更改另一个请求正在使用的基础值,那么请使用 F
到 avoid race conditions .
在一个请求中,因为一切都是顺序的和单线程的,所以不存在变量不同步的风险:你知道事情完成的顺序,因此当你知道一个时总是可以调用 refresh_from_db()
先前的方法调用可能已更改数据库值。
另请注意:让两个变量保存同一行意味着您将对数据库执行两次查询,这是您要不惜一切代价避免的一件事。所以你首先应该想想为什么会出现这种情况。