如何在Django中导出实例及其所有相关对象?

时间:2015-05-11 13:27:48

标签: python django serialization django-models

有人在生产中意外删除了一个实例和所有相关对象(通过Django管理员)。我有一个数据库的备份,所以我可以恢复这些数据,但我想用脚本而不是复制数据,因为它包含很多的相关对象。

我想检索已删除的项目(我确实有它的模型及其pk,所以我可以MyModel.objects.get(pk=123456)),还有它的所有相关对象(ForeignKey,{{ 1}} ...)以某种方式在生产数据库中重新导入它们。

使用ManyToMany可以是SQL或任何序列化格式。我怎么能这样做?

1 个答案:

答案 0 :(得分:6)

要实现这一目标,您需要合并collection of related objectstheir serialization。由于您知道已删除的确切模型实例,因此您可以先删除所有对象(与django管理员一样,使用NestedObjects收集器),然后在此列表上迭代以生成json。

更合适的是做一次性脚本(注意2016年9月:更新为Django> = 1.9):

from itertools import chain      

from django.core import serializers
from django.contrib.admin.utils import NestedObjects

from myproject.myapp.models import MyModel

collector = NestedObjects(using="default") # database name
collector.collect([MyModel.objects.get(pk=123456)])

objects = list(chain.from_iterable(collector.data.values()))
with open("backup_export.json", "w") as f:
    f.write(serializers.serialize("json", objects))

这将生成一个包含已删除的所有实例的json文件。您现在可以使用manage.py loaddata将它们放回生产数据库。当重新导入json时,你should deactivate the post_save signal,否则它有时会因复杂的依赖而失败。