我如何将Django模型的实例在数据库中进行"pickling"并转换为可用于加载示例数据的Python代码?

8
我如何将Django模型实例在数据库中进行“pickle”并转化为可以用于加载样本数据的Python代码?
我想要: 1)拍摄在MySQL数据库中存储的几百条记录的快照,这些记录是为Django项目保留的。 2)采取这个快照并修改其中的数据(抹掉名称)。 3)将此数据转换为“pickled字符串”或实际的Python代码,以便我可以将数据加载到新用户的帐户中。
我试图实现的主要功能是选择我当前活动的Django网站用户之一,复制并匿名一些他们的数据,然后将其作为所有新用户的示例数据加载到网站上,以帮助他们学习系统。

2
这听起来很像它... https://docs.djangoproject.com/en/dev/howto/initial-data/ - Izkata
Django可以导出JSON数据。使用Django内部序列化要容易得多。为什么你不想简单地使用Python的dumpdataloaddata内置命令呢? - S.Lott
2个回答

14

一个简单的方法是将模型转换为字典。然后,您可以轻松地将其pickle化,然后重新inflate它以创建新的模型实例。

要将模型存储为字典,您可以使用内置的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()

8
注意,如果字典包含外键,您将无法从该字典创建新模型,因为这将引发ValueError异常。 - Robin Elvin

3

在Django 1.8及以上版本中,如果您的模型有外键,您可以使用以下代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接