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

How can I export an instance and all its related objects in Django?

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

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

它可以是 SQL 或任何序列化格式,以使用 loaddata。我该怎么做?

为此,您需要结合 collection of related objects and their 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,否则它有时会因复杂的依赖关系而失败。