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

Posted

技术标签:

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

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

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

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

【问题讨论】:

这听起来很像...docs.djangoproject.com/en/dev/howto/initial-data Django 可以以 JSON 格式导出数据。使用 Django 自己的内部序列化要容易得多。为什么不直接使用 Python 的 dumpdataloaddata 内置命令? 【参考方案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')])

【讨论】:

以上是关于如何将数据库中的 Django 模型实例“腌制”到可用于加载示例数据的示例 python 代码中?的主要内容,如果未能解决你的问题,请参考以下文章

无法腌制 Scikit 学习最近邻分类器 - 无法腌制实例方法对象

如何在 Django 中序列化模型实例?

如何在 django 中处理未保存的多对多关系?

如何以最少的数据库点击次数将多个实例添加到 Django 反向外键集?

Django:我可以通过单个方法调用将新模型实例列表添加到数据库吗?

将子类模型实例转换为 django 中的另一个子类模型实例?