【问题标题】:How to Pickle Django Model如何腌制 Django 模型
【发布时间】:2015-09-11 22:53:05
【问题描述】:

我目前正在尝试腌制某些 Django 模型。我为模型创建了__getstate____setstate__ 方法,但看起来pickle.dumps() 正在使用默认的__reduce__

有没有办法强制使用 __getstate____setstate__ ?如果没有,覆盖 __reduce__ 的最佳方法是什么?

如果有帮助的话,我目前正在使用 Django 1.6 和 Python 2.7.6。

本质上,我使用 get 和 set 状态在酸洗之前删除两个字段以节省空间。

【问题讨论】:

  • 当你可以将它存储在数据库中(如果你试图持久化它)或将它转换为 json (如果你试图将它传输给其他人)时,为什么还要腌制它..?
  • 你好!所以这就是我试图避免的。这个想法是将腌制的对象存储在缓存中,而不是访问数据库。转换为 json 很困难,因为我发现很难从 json 数据中取回原始对象,这在我的实现中是必需的
  • 你几乎肯定不想缓存你的模型。这将在以后导致许多数据一致性问题。您实际上试图解决的性能问题是什么?
  • 缓存模型是我现在想要的方式,我已经进行了检查以处理数据一致性。一般来说,问题是我的数据库经常被这些模型命中,所以我希望它们被缓存,然后在以后批量更新。我正在避免使用 json,因为该模型具有我想在代码库的其他区域中维护的某些功能
  • 你所描述的没有意义。您是否尝试缓存特定查询的结果?因为根据其主键从数据库中加载模型不会比从泡菜文件中拉出实例快得多。如果您遇到性能问题,则可能是模板生成或查询索引错误。如果您能更详细地描述您遇到的性能问题,我们可以更好地帮助您解决它。

标签: python django pickle


【解决方案1】:

虽然这并不是我问题的真正“答案”,但我发现的最佳解决方案是在模型上实现 dehydrate() 方法,允许我更改模型的 __dict__ 并存储它。

从缓存中恢复时,只需使用** 语法即可,您将恢复原来的模型。

【讨论】:

    【解决方案2】:

    使用 pickle getstate/setstate 您可以让模型自动腌制主键,并在取消腌制时使用它来加载。

    https://docs.python.org/2/library/pickle.html#object.getstate

    像这样:

    class FooModel(Model):
        field1 = CharField()
    
        def __getstate__(self):
            return self.pk
    
        def __setstate__(self, state):
            self.pk = state
            self.refresh_from_db()
    

    这让你腌制 django 模型,它存储的只是主键。然后,当您 unpickle 时,它​​会使用主键获取字段。

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多