【问题标题】:How do I "pickle" instances of Django models in a database into sample python code I can use to load sample data?如何将数据库中的 Django 模型实例“腌制”到可用于加载示例数据的示例 python 代码中?
【发布时间】:2012-02-19 03:42:05
【问题描述】:

如何将数据库中的 Django 模型实例“腌制”成可用于加载示例数据的示例 Python 代码?

我想:
1) 为一个 Django 项目拍摄我存储在 MySQL 数据库中的数百条记录的快照
2) 拍摄此快照并修改其中的数据(删除名称)
3) 将这些数据转换为“腌制字符串”或实际的 Python 代码,我可以使用这些代码将数据加载到新用户帐户中。

我正在尝试实现的主要功能是选择我当前活跃的 Django 网站用户之一,复制并匿名化他们的一些数据,然后将其作为示例数据加载给网站的所有新用户,以便他们可以使用这些数据有助于学习系统。

【问题讨论】:

  • Django 可以以 JSON 格式导出数据。使用 Django 自己的内部序列化要容易得多。为什么不直接使用 Python 的 dumpdataloaddata 内置命令?

标签: python django pickle sample-data


【解决方案1】:

一个简单的方法是将模型转换为字典。然后,您可以简单地腌制它,然后重新膨胀它以创建新的模型实例。

要将模型存储为字典,可以使用内置的 Django 函数:

from django.forms.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])

将实例转换为字典并编辑必要的内容后,只需使用普通的pickle.dumpspickle.loads 方法来存储和检索数据。要使用该字典创建新模型实例,您可以执行以下操作:

my_instance = MyModel(**my_dict)
#add any customization for the new instance here
my_instance.save()

【讨论】:

  • 请注意,如果字典包含外键,则无法从字典创建新模型,因为它会引发 ValueError
【解决方案2】:

在 Django 1.8 及以上版本上,如果你的模型有外键,你可以使用:

my_dict = dict([(f.attname, getattr(instance, f.attname))
               for f in instance._meta.get_fields()
               if hasattr(f, 'attname')])

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2021-03-30
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2012-04-13
    • 2018-02-07
    相关资源
    最近更新 更多