如何腌制 Django 模型
How to Pickle Django Model
我目前正在尝试 pickle 某些 Django 模型。我为模型创建了 __getstate__
和 __setstate__
方法,但看起来 pickle.dumps()
正在使用默认的 __reduce__
。
有没有办法强制使用 __getstate__
和 __setstate__
?如果没有,覆盖 __reduce__
的最佳方法是什么?
我目前正在使用 Django 1.6 和 Python 2.7.6,如果有帮助的话。
本质上,我使用 get 和 set state 在酸洗之前删除两个字段以保存 space。
虽然这不是真正的 "answer" 我的问题,但我找到的最佳解决方案是在模型上实施 dehydrate()
方法,允许我更改模型的 __dict__
和存储它。
从缓存中恢复时,只需使用 **
语法即可,您将恢复原始模型。
使用 pickle getstate/setstate 你可以让你的模型自动只 pickle 主键并在 unpickle 时使用它加载。
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()
这让你 pickle django 模型,它存储的只是主键。然后,当您解开它时,它会使用主键获取字段。
我目前正在尝试 pickle 某些 Django 模型。我为模型创建了 __getstate__
和 __setstate__
方法,但看起来 pickle.dumps()
正在使用默认的 __reduce__
。
有没有办法强制使用 __getstate__
和 __setstate__
?如果没有,覆盖 __reduce__
的最佳方法是什么?
我目前正在使用 Django 1.6 和 Python 2.7.6,如果有帮助的话。
本质上,我使用 get 和 set state 在酸洗之前删除两个字段以保存 space。
虽然这不是真正的 "answer" 我的问题,但我找到的最佳解决方案是在模型上实施 dehydrate()
方法,允许我更改模型的 __dict__
和存储它。
从缓存中恢复时,只需使用 **
语法即可,您将恢复原始模型。
使用 pickle getstate/setstate 你可以让你的模型自动只 pickle 主键并在 unpickle 时使用它加载。
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()
这让你 pickle django 模型,它存储的只是主键。然后,当您解开它时,它会使用主键获取字段。