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

Max*_*ant 5 python django serialization django-models

有人不小心删除了生产中的实例和所有相关对象(通过Django admin)。我有数据库的备份,所以我可以取回那些数据,但是我想用脚本而不是复制数据,因为它包含许多相关的对象。

我想检索已删除的项目(我确实拥有其模型和pk,所以可以这样做MyModel.objects.get(pk=123456)),还希望检索其所有相关对象(ForeignKeyManyToMany...),以便在生产中重新导入它们。数据库。

可以使用SQL或任何序列化格式loaddata。我怎样才能做到这一点?

Max*_*ant 9

为了实现这一目标,您需要将结合收集相关的对象他们的系列化。由于您知道已删除的确切模型实例,因此可以首先删除所有对象(与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))
Run Code Online (Sandbox Code Playgroud)

这将生成一个带有所有已删除实例的json文件。您现在可以使用manage.py loaddata将它们放回到生产数据库中。重新导入json时,应停用post_save信号,否则有时会因复杂的依赖项而失败。