如何将数据库中的 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 的dumpdata
和 loaddata
内置命令?
【参考方案1】:
一个简单的方法是将模型转换为字典。然后,您可以简单地腌制它,然后重新膨胀它以创建新的模型实例。
要将模型存储为字典,可以使用内置的 Django 函数:
from django.forms.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])
将实例转换为字典并编辑必要的内容后,只需使用普通的pickle.dumps
和pickle.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 反向外键集?