【问题标题】:Python Pickle object in Django modelDjango模型中的Python Pickle对象
【发布时间】:2019-10-15 15:48:59
【问题描述】:

我想知道使用 Django ORM 在 PostgreSQL DB 中存储泡菜对象的最简单方法是什么。

【问题讨论】:

  • 您是否有特定的原因要使用 pickle 而不是其他东西,例如 Django 模型为您提供的开箱即用的东西?泡菜不是很便携。
  • 请不要那样做。如果你以后更新你的 Python 版本,你会遇到麻烦。只需使用 JSON 或类似的东西。
  • 非常感谢您的建议。是否有一个模块可以将类对象转换为 json 并且也可以重新转换回原始对象?
  • 您可以使用import json; json.dumps(ClassInstance.__dict__) 之类的方法恢复我不太确定的类...也许创建一个替代构造函数并使用字典调用它?
  • ...但是,再次,为什么?您特别说您正在尝试将对象存储在 Postgres 数据库中。如果它们是 Django 模型,您已经可以这样做,而无需使用 JSON 或任何其他序列化格式。

标签: python django postgresql pickle django-orm


【解决方案1】:

您可以使用BinaryField 来存储腌制对象。

从问题的 cmets 中,您还可以使用 JSONField 来存储类实例中的 dict。你可以这样做:

from django.contrib.postgres.fields import JSONField

class YourModel(models.Model):
    data = JSONField()

假设你有一个这样的类(你想存储它):

class YourClass(object):
    a = None
    b = None
    c = None

    def __str__(self):
        return 'Your Class: {}, {}, {}'.format(self.a, self.b, self.c)

现在你可以像这样生成字典了:

some_instance = YourClass(a=1, b=2, c=3)
cls_dict = some_instance.__dict__
print(cls_dict)
# {'a': 1, 'b': 2, 'c': 3}

y = YourModel(data=cls_dict)
y.save()

现在您可以尝试从字典中恢复 Class 实例,如下所示:

y = YourModel.objects.first()
some_instance = YourClass()
some_instance.__dict__.update(y.data)

print(some_instance)

# 'Your Class: 1, 2, 3'

【讨论】:

    【解决方案2】:

    我不会评论在数据库中使用腌制数据是否明智。但是您可以使用django-picklefield 库来存储腌制数据:

    https://pypi.org/project/django-picklefield/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多