【问题标题】:How can I export an instance and all its related objects in Django?如何在 Django 中导出实例及其所有相关对象?
【发布时间】:2015-07-22 00:48:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django serialization django-models


    【解决方案1】:

    为此,您需要将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,否则有时会因复杂的依赖关系而失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 2017-04-12
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多