当我为同一 ID 调用 Models.get()
时,它返回不同的 Python 对象:
print(Book.objects.get(id=1) is Book.objects.get(id=1))
>>> False
我想知道是否可以改变这种行为,也许可以使用一些自定义模型管理器。它可以在内部为所有检索到的对象存储一些注册表,并覆盖 get_queryset()
以使其使用此注册表中的对象(如果已检索到这些对象)。
为什么它会有帮助
我有一个模型ServerCredentials
,它存储登录名和密码。我有多个使用相同凭据进行连接的消费者。由于只允许与服务器建立一个连接,因此将临时连接信息(例如身份验证 token )存储为 ServerCredentials 对象的字段(而不是数据库中)会很方便。如果模型对象可以是单例,那么消费者只需使用 ServerCredentials
字段即可轻松共享身份验证 token 。如果没有它,我必须手动创建一些注册表,但我认为它应该在 ModelManager
端完成。
- 是否可以在
ModelManager
端的注册表中缓存对象? - 这是个好主意吗?
- 有相应的实现吗?
非常感谢!
最佳答案
模型的管理器是其各自类的常规实例,因此您可以实现某种注册表。然而,这个注册表对于每个进程都是唯一的。在生产中,您的应用程序通常由启动多个进程的服务器运行,例如uwsgi(甚至在多台机器上运行)。
如果您想让 transient 数据在整个应用程序中可用,您可以将 Django 的缓存设施与内存存储(如 Memcached 或 Redis)结合使用。
关于python - 我可以将 Django 模型对象作为单例获取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51220853/