如何为 django 模型对象自定义 pickle

发布于 2024-08-25 08:47:15 字数 471 浏览 7 评论 0原文

我的应用程序使用“每用户会话”来允许同一用户的多个会话共享状态。它的操作方式与 django 会话非常相似,都是通过酸洗对象来实现的。

我需要 pickle 一个引用 django 模型对象的复杂对象。标准 pickle 过程将非规范化对象存储在 pickle 中。因此,如果数据库上的对象在 pickling 和 unpickling 之间发生更改,则该模型现在已过时。 (我知道内存中的对象也是如此,但是酸洗是解决这个问题的一个方便的时间。)

显然,将这​​个复杂的东西存储在数据库中会更干净,但它不切实际。随着项目的发展,它的代码必然会迅速变化。每次对象的数据模型更改时都必须更新数据库架构,这会大大减慢项目速度。

所以我想要的是一种不腌制完整 django 模型对象的方法。相反,只需存储其类和 ID,并在加载时从数据库重新获取内容。我可以为此类指定自定义 pickle 方法吗?如果有办法进行酸洗,我很高兴围绕 django 模型编写一个包装类来处理从数据库的延迟获取。

My app uses a "per-user session" to allow multiple sessions from the same user to share state. It operates very similarly to the django session by pickling objects.

I need to pickle a complex object that refers to django model objects. The standard pickling process stores a denormalized object in the pickle. So if the object changes on the database between pickling and unpickling, the model is now out of date. (I know this is true with in-memory objects too, but the pickling is a convenient time to address it.)

Clearly it would be cleaner to store this complex in the database, but it's not practical. The code for it is necessarily changing rapidly as the project evolves. Having to update the database schema every time the object's data model changes would slow the project down a lot.

So what I'd like is a way to not pickle the full django model object. Instead just store its class and id, and re-fetch the contents from the database on load. Can I specify a custom pickle method for this class? I'm happy to write a wrapper class around the django model to handle the lazy fetching from db, if there's a way to do the pickling.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄情伤 2024-09-01 08:47:15

目前还不清楚你的目标是什么。

“但是如果我只是将 id 和 class 存储在一个元组中,那么每次使用任何 django 对象时我都必须返回数据库。我希望能够将我正在使用的对象保留在内存中在页面请求的过程中。”

这是没有意义的,因为视图函数页面请求,并且视图函数中有局部变量,可以保留对象直到完成。

此外,Django 的 ORM 具有缓存。

最后,Django 提供的会话是请求之间“内存中对象”的通常位置。

你不需要腌制任何东西。

It's unclear what your goal is.

"But if I just store the id and class in a tuple then I'm necessarily going back to the database every time I use any of the django objects. I'd like to be able to keep the ones I'm using in memory over the course of a page request."

This doesn't make sense, since a view function is a page request and you have local variables in your view function that keep your objects around until you're finished.

Further, Django's ORM bas a cache.

Finally, the Django-supplied session is the usual place for "in-memory objects" between requests.

You shouldn't need to pickle anything.

空宴 2024-09-01 08:47:15

您可以重载序列化方法。但将 id 和 class 放入元组或字典中并对其进行 pickle 会更简单。

You can overload the serialization methods. But it would be simpler to put the id and class in a tuple or dict and pickle that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文